目的:把精彩豆列频道里的每个豆列里的内容抓取出来。
流程是抓取目录页精彩豆列频道豆列的地址-对每个豆列所有页数都抓取具体内容、网址、时间。
这就很标准crawlspider干的活了,把目录页的地址写成start_request依次爬取,然后对每个豆列都用rules控制。
图片.png
目录页的分析:
豆瓣豆列挺有意思,没做分页,直接js获取数据,json数据又长得像html的样子,没别的参数非常好爬。
json长这样:
request
有了这两项就可以想提取多少就提取多少豆列地址了,我做了前200个。
import scrapy
from scrapy.spiders import CrawlSpider,Rule
from scrapy.linkextractors import LinkExtractor
from pyquery import PyQuery as pq
import requests
from douban.items import DoubanItem
import logging
class DbSpider(CrawlSpider):
name = 'db'
# allowed_domains = ['douban.com/doulist/']
rules = (Rule(
LinkExtractor(allow ='\?start'), callback = 'parse_detail', follow = True),)
# restrict_xpaths = ('//*[@id="content"]/div/div[1]/div[25]/a')
def start_requests(self):
url = 'https://www.douban.com/j/doulist/doulists?start=0&limit=200'
res = requests.get(url)
cont = pq(res.json()['html'])
for item in cont('.doulist-item').items():
logging.info(item('.title a').attr('href'))
yield scrapy.Request(item('.title a').attr('href'))
def parse_detail(self, response):
logging.info(response.url)
res = pq(response.body)
for item in res('.doulist-item .mod').items():
dbitem = DoubanItem()
dbitem['title'] = item('.title a').text()
dbitem['index_url'] = response.url
logging.info(item('.title a').text())
dbitem['url'] = item('.title a').attr('href')
dbitem['times'] = item('.time span').text()
yield dbitem
有几个坑:
- restrict_xpaths = ('//*[@id="content"]/div/div[1]/div[25]/a')可以提取url,但是遇到很多页中间有省略项比如1 2...9 10,他就只能提取1,2,9,10,想来也是3-8都没有显示出来怎么提取呢,这时候用allow网址提取就好了,网址https://www.douban.com/doulist/37669191/?start=25&sort=time&playable=0&sub_type=,相似性是‘start=’前面的问号需转译。
2.rules需iterable,这次rules只有一项所以要在后面加逗号。
3.restrict_xpaths用浏览器提取
网友评论