python爬蟲(chóng)如何批量爬取糗事百科段子
問(wèn)題描述
剛學(xué)Python不會(huì)scrapy框架,就是想做個(gè)簡(jiǎn)單爬蟲(chóng)實(shí)現(xiàn)抓取前10頁(yè)段子(前N頁(yè))。請(qǐng)問(wèn)不用scrapy能有什么簡(jiǎn)單一些的代碼能實(shí)現(xiàn)?之前有試過(guò)在page那里加for循環(huán),但是也只能抓到一個(gè)頁(yè)面,不知道怎么弄。
import urllibimport urllib2import repage = 1url = ’http://www.qiushibaike.com/8hr/page/’ + str(page)user_agent = ’Mozilla/5.0 ( Windows NT 6.1)’headers = { ’User-Agent’ : user_agent }try: request = urllib2.Request(url,headers = headers) response = urllib2.urlopen(request) content = response.read().decode(’utf-8’) pattern = re.compile(’<p.*?class='content'>.*?<span>(.*?)</span>.*?</p>.*?’,re.S) items = re.findall(pattern,content) for item in items:print itemexcept urllib2.URLError, e: if hasattr(e,'code'):print e.code if hasattr(e,'reason'):print e.reason
問(wèn)題解答
回答1:我跑了一下你的代碼,發(fā)現(xiàn)能跑出前2個(gè)頁(yè)面,后面都返回了一個(gè)錯(cuò)誤碼,我覺(jué)得是因?yàn)槟銢](méi)做防反爬處理,因?yàn)槟氵@個(gè)結(jié)果在一秒內(nèi)就跑出來(lái)了,一秒內(nèi)連續(xù)10次訪問(wèn)肯定不是人能做到的。
很多網(wǎng)站都能知道你這是用代碼在刷他們的網(wǎng)站,有些網(wǎng)站很討厭這個(gè),會(huì)做反爬處理,可能直接把你的 IP 都給封了,讓你沒(méi)法訪問(wèn),因?yàn)槿绻贿@樣做,短時(shí)間內(nèi)直接訪問(wèn)太多次的話可能會(huì)把人家的網(wǎng)站都弄癱瘓了。
我的建議是每爬完一個(gè)頁(yè)面等待1秒,修改了下你的代碼:
import urllibimport urllib2import reimport timefor page in range(1, 11): print(’at page %s’ % page) url = ’http://www.qiushibaike.com/8hr/page/’ + str(page) user_agent = ’Mozilla/5.0 ( Windows NT 6.1)’ headers = { ’User-Agent’ : user_agent } try:request = urllib2.Request(url,headers = headers)response = urllib2.urlopen(request)content = response.read().decode(’utf-8’)pattern = re.compile(’<p.*?class='content'>.*?<span>(.*?)</span>.*?</p>.*?’,re.S)items = re.findall(pattern,content)for item in items: print item except urllib2.URLError, e:if hasattr(e,'code'): print e.codeif hasattr(e,'reason'): print e.reasontime.sleep(1)
我這邊是能出結(jié)果的,不過(guò)我想向你推薦另一個(gè)第三方的庫(kù),叫 requests,既然你會(huì) urllib,這也就不難,但是使用起來(lái)更人性化,配合 BeatuifulSoup 庫(kù)(用來(lái)解析和處理 HTML 文本的)很方便,你也可以去網(wǎng)上搜一下,了解一下。
還有就是以后做爬蟲(chóng)一定要注意做防反爬處理!
相關(guān)文章:
1. python - beautifulsoup獲取網(wǎng)頁(yè)內(nèi)容的問(wèn)題2. Docker for Mac 創(chuàng)建的dnsmasq容器連不上/不工作的問(wèn)題3. docker鏡像push報(bào)錯(cuò)4. docker - 如何修改運(yùn)行中容器的配置5. docker-machine添加一個(gè)已有的docker主機(jī)問(wèn)題6. Android "1"=="1" 到底是true還是false7. fragment - android webView 返回后怎么禁止重新渲染?8. angular.js - 在終端中用yeoman啟用angular-generator報(bào)錯(cuò),求解?9. java - 請(qǐng)問(wèn)在main方法中寫(xiě)成對(duì)象名.屬性()并賦值,與直接參參數(shù)賦值輸錯(cuò)誤是什么原因?10. docker不顯示端口映射呢?
