python爬虫如何批量爬取糗事百科段子
伊谢尔伦
伊谢尔伦 2017-04-18 10:20:18
0
1
709

刚学Python不会scrapy框架,就是想做个简单爬虫实现抓取前10页段子(前N页)。请问不用scrapy能有什么简单一些的代码能实现?之前有试过在page那里加for循环,但是也只能抓到一个页面,不知道怎么弄。

import urllib
import urllib2
import re

page = 1
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.code
    if hasattr(e,"reason"):
        print e.reason
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

répondre à tous(1)
Peter_Zhu

J'ai exécuté votre code et j'ai constaté qu'il manquait les deux premières pages, mais j'ai renvoyé un code d'erreur par la suite. Je pense que c'est parce que vous n'avez pas effectué de traitement anti-exploration, car votre résultat a été épuisé en une seconde. À sa sortie, 10 visites consécutives en une seconde n'est certainement pas quelque chose que les humains peuvent faire.

De nombreux sites Web peuvent savoir que vous utilisez du code pour brosser leur site Web. Certains sites Web détestent cela et effectueront un anti-crawling. Ils peuvent bloquer directement votre adresse IP et vous empêcher d'y accéder, car si vous ne le faites pas. , un accès direct trop répété sur une courte période de temps peut paralyser les sites Web d'autres personnes.

Ma suggestion est d'attendre 1 seconde après avoir exploré une page et de modifier votre code :

import urllib
import urllib2
import re
import time

for 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.code
        if hasattr(e,"reason"):
            print e.reason
    
    time.sleep(1)

Je peux obtenir des résultats ici, mais j'aimerais vous recommander une autre bibliothèque tierce, appelée requêtes. Puisque vous connaissez urllib, ce n'est pas difficile, mais c'est plus convivial à utiliser et cela fonctionne avec. la bibliothèque BeatuifulSoup ( (utilisée pour analyser et traiter le texte HTML) est très pratique. Vous pouvez également effectuer une recherche en ligne pour en savoir plus.

De plus, lorsque vous ferez des robots à l'avenir, vous devez faire attention à éviter l'anti-crawling !

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!