2017-01-20 5 views
0

Ich möchte den Crawler auf die nächste Seite gehen, um Daten zu extrahieren jede Hilfe auf was zu tun ist. Ich bin ein wenig verloren auf was zu tun ist. Ich habe versucht, scrapy, aber es ist ein wenig kompliziert und bs4 ist bequemer.Webcrawler mehrere Seite Iteration

import bs4 as bs 
import urllib.request 
import pandas as pd 
import re 


source = urllib.request.urlopen('https://messageboards.webmd.com/').read() 

soup = bs.BeautifulSoup(source,'lxml') 


df = pd.DataFrame(columns = ['link'],data=[url.a.get('href') for url in soup.find_all('div',class_="link")]) 
lists=[] 

for i in range(0,33): 
    link = (df.link.iloc[i]) 
    source1 = urllib.request.urlopen(link).read() 
    soup1 = bs.BeautifulSoup(source1,'lxml') 
    for url1 in soup1.find_all('a',class_="next"): 
     next_link = soup1.find('a',href = True, text = re.compile("next")) 
     if next_link: 
      lists.append(link+url1.get('href')) 

Antwort

0

Ich habe das gleiche Problem. Hier ist mein Codebeispiel für eine Seite, die ich zur Übung gecrawlt habe. Ich habe mehrere Websiteanfragen angekettet, um detaillierte Informationen zu erhalten.

import scrapy 
from scrapy.linkextractors import LinkExtractor 
from scrapy.spiders import CrawlSpider, Rule 
from capterra.items import CapterraItem 

class CapterraCatSpider(CrawlSpider): 
    name = 'capterra_cat' 
    #allowed_domains = ['http://www.capterra.com/categories'] 
    start_urls = ['http://www.capterra.com/categories'] 
    # rules = (
    #  Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True), 
    #) 

def parse(self, response): 
    #TEMP 
    for category in response.css('ol.browse-group-list'): 
     #Debug: only elements of one category 
     if category.css('a::text').extract_first() == 'Yoga Studio': 
      i = CapterraItem() 
      #Get link to detail page 
      i['cat_name'] = category.css('a::text').extract_first() 
      #join link to detail page with base url 
      i['cat_link'] = response.urljoin(category.css('a::attr(href)').extract_first()) 

      cat_link = i['cat_link'] 
      print cat_link 
      #call request to detail page and pass response to parse_details method with callback method 
      request = scrapy.Request(cat_link, callback=self.parse_details) 

      request.meta['item'] = i 
      yield request 

def parse_details(self,response): 
    #Debug print 
    print 'DETAILS!' 
    #read your items from response meta 
    item = response.meta['item'] 
    #iterate over listings 
    for detail in response.css('p.listing-description.milli'): 
     item['profile_link'] = response.urljoin(detail.css('a.spotlight-link::attr(href)').extract_first()) 
     #call request to profile page to get more information for listing 
     request = scrapy.Request(item['profile_link'], callback=self.parse_profile) 
     #set your item to rquest metadata 
     request.meta['item'] = item 
     yield request 

def parse_profile(self,response): 
    #Debug print 
    print 'PROFILE' 
    item = response.meta['item'] 
    item['product_name'] = response.css('h1.beta.no-margin-bottom::text').extract_first() 
    item['who_uses_software'] = response.css('div.spotlight-target > p.epsilon > i::text').extract_first() 
    item['vendor_name'] = response.css('h2.spotlight-vendor-name > span::text').extract_first() 

    return item 
0

So sieht es aus wie du bist hrefs in einer Liste

for url1 in soup1.find_all('a',class_="next"): 
    next_link = soup1.find('a',href = True, text = re.compile("next")) 
    if next_link: 
     lists.append(link+url1.get('href')) 

Jetzt speichert tatsächlich Sie haben etwas mit ihnen zu tun. In diesem Fall gehe ich davon aus, dass Sie zu jedem href in Ihrer Liste navigieren möchten.

for href in lists: 
    new_page = urllib.request.urlopen(href).read() 

Und dann können Sie kratzen, was Daten, die Sie aus new_page

wollen