爬取糗事百科的段子
settings文件
遵守机器人协议
如果是True,当爬虫去爬取指定url的时候会先从网站的根目录下找robots.txt文件,如果找不到就不进行爬取了
ROBOTSTXT_OBEY = False
在这里写请求头
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0'
}
哪个pipeline先执行,取决于后面的值,值越小权值越高
ITEM_PIPELINES = {
'qsbk.pipelines.QsbkPipeline': 300,
}
settngs文件中是项目的一些配置,包括请求头......
spiders/qsbk_spider
class QsbkSpiderSpider(scrapy.Spider):
name = 'qsbk_spider'
allowed_domains = ['qiushibaike.com']
"""开始的url"""
start_urls = ['https://www.qiushibaike.com/8hr/page/1/']
"""response是HtmlResponse对象"""
def parse(self, response):
""" SelectorList"""
duanziDivs = response.xpath("//div[@id='content-left']/div")
""" 遍历SelectorList得到Selector"""
for duanziDiv in duanziDivs:
""" extract()得到符合条件的所有元素提取html代码,等价于getall(),返回列表"""
""" extract_first()得到符合条件的第一个元素并提取其html代码,等价于get()"""
author = duanziDiv.xpath(".//h2/text()").get().strip()
content = duanziDiv.xpath(".//div[@class='content']//text()").getall()
content = "".join(content).strip()
"""生成器的方式将数据传入items进行存储"""
item = QsbkItem(author=author,content=content)
yield item
这个文件中对数据进行解析,提取出自己需要的信息,然后传入items进行存储。
items
class QsbkItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
author = scrapy.Field()
content = scrapy.Field()
构建需要存储的字段,spiders/qsbk_spider文件中调用QsbkItem类也是根据这。
pipeline
class QsbkPipeline(object):
def __init__(self):
self.fp = open("duanzi.json",'w',encoding='utf-8')
def open_spider(self,spider):
print("begin"+"."*20)
"""这里写数据应该怎样存储"""
def process_item(self, item, spider):
item_json = json.dumps(dict(item),ensure_ascii=False)
self.fp.write(item_json+"\n")
def close_spider(self,spider):
print("end"+"."*20)
存储文件的方式有很多种CSV,json,甚至存储到数据库中都可以在这实现。