2017-01-20 20 views
0

クローラを次のページに移動して、何をすべきかに関するヘルプを抽出します。私は何をするのか分からない。私はscrapyを試みましたが、それはちょっと複雑で、bs4はより便利です。Webcrawler複数ページの反復

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')) 

答えて

0

私は同じ問題を抱えています。ここで私がエクササイズのためにクロールしたページのコード例を示します。私は詳細な情報を得るために複数のサイトリクエストをチェーンしています。

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

リスト

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')) 

でのhrefを格納しているようなので、それが今、あなたは実際に彼らと何かをする必要がありそうです。この場合、私はあなたのリストの各hrefに移動したいと仮定しています。

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

そして、あなたはNEW_PAGE

のうち、好きなデータをこすりすることができます