抓取 的目标网站是小说网站:笔趣看 小说名为 元尊
http://biqukan.com/0_790/
思路;先抓取每个章节的链接,然后在通过链接抓取小说的内容 抓取的链接的页面:。
1.新建项目:
scrapy startproject biqukanproject
2.cd进入项目文件biqukanproject, 以basic模板新建爬虫
cd biqukanproject
scrapy genspider -t basic biqukanspider biqukan.com
image.png
3 .明确需要抓的字段:小说名 、章节名称、章节链接、章节的内容。编写item
# -*- coding: utf-8 -*-
import scrapy
class BiqukanprojectItem(scrapy.Item):
url = scrapy.Field()
title_novel = scrapy.Field()
title_chapter = scrapy.Field()
content = scrapy.Field()
编写item
4.编写Spider爬虫文件
先分析一下页面结构,使用Xpath helper ,输入xpath表达式来定位元素
image.png
循环抓取章节信息以及章节链接,进入章节内抓取内容
# -*- coding: utf-8 -*-
import scrapy
from scrapy.selector import Selector
from biqukanproject.items import BiqukanprojectItem
class BiqukanspiderSpider(scrapy.Spider):
name = 'biqukanspider' # 爬虫的名称
allowed_domains = ['biqukan.com'] # 允许的域名
start_urls = ['http://biqukan.com/0_790/']
# 开始爬取的链接
def parse(self, response):
# 链接爬取的方法
selector = Selector(response)
# 创建一个选择器的实例
listmain = selector.xpath('.//div[@class="listmain"]/dl/dd')[60:64]
for dd in listmain:
title_novel = selector.xpath('.//h2/text()').extract_first()
item = BiqukanprojectItem(title_novel=title_novel)
partial_url = dd.xpath('.//a/@href').extract_first()
url = response.urljoin(partial_url)
title_chapter = dd.xpath('.//a/text()').extract_first()
item['url'] = url
item['title_chapter'] =title_chapter
request = scrapy.Request(url=url,callback=self.parse_body)
# 从这里可以看出,scrapy.Request返回值是它回调函数的返回值
# Request中有一个参数是meta
# 作用是将一个信息(任意的类型)传递给callback回调函数
# 当然传递使用字典的形式进行的,
# meta={'key':item} (下面的request.meta【‘item’】可以这么写)
# 这里为了将详情页的内容和主页的内容一起存储,用了meta方法对,主页的内容
# 进行了一个暂存,在后面进行统一的提交
request.meta['item'] = item # 将item暂存一下
yield request
def parse_body(self,response):
# 爬取详情页的方法
item = response.meta['item']
# 这是在回调函数中调用刚传进来的信息
# 当然用的是字典的形式调用信息的呀
# 这是回调函数中有一个response的meta属性可以调用传过来的信息
content_list = response.xpath('.//div[@id="content"]/text()').extract()
content = '\n\n'.join(content_list)
# 提取详情页的内容
item['content'] = content
print( item['content'])
yield item
# yield是将这个函数包装成一个迭代器,每次调用都返回这个item
编写spider
5.编写Pipeline文件,存储成json
class BiqukanprojectPipeline(object):
def __init__(self):
self.file = open('novel.json',"wb")
def process_item(self, item, spider):
self.file.write(bytes(str(item),encoding='utf-8'))
return item
image.png
6.设置setting
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'
ITEM_PIPELINES = {
'biqukanproject.pipelines.BiqukanprojectPipeline': 300,
}
修改请求头
7.运行爬虫文件
scrapy crawl biqukanspider --nolog
image.png
8.查看json文件
image.png9 源码地址
github https://github.com/wzw5566/biqukanproject
觉得文章有用,请用支付宝扫描,领取一下红包!打赏一下
支付宝红包码
网友评论