当前文件 :D:\python_test\scrapyProject\scrapyProject\spiders\first.py
import scrapy
class FirstSpider(scrapy.Spider):
name = 'first'
start_urls = ['https://ishuo.cn/duanzi']
def parse(self, response):
# 直接调用xpath方法对响应数据进行xpath形式的数据解析
list_li = response.xpath('//*[@id="list"]/ul/li')
for li in list_li:
# title = li.xpath('./div[2]/a/text()')[0]
# print(title) 打印是selector的对象,且数据存在于该对象的data参数里,
#
# 解析方案1:
title = li.xpath('./div[2]/a/text()')[0]
# extract()可以将selector对象中data参数的值取出
print(title.extract())
# 解析方案2:
# title是一个Selector对象的列表,我们只要第一个列表元素
title = li.xpath('./div[2]/a/text()')
# extract_first()可以将列表中第0个列表元素表示的selector对象中data的参数值取出
print(title.extract_first())
break
termail目录下()执行:scrapy crawl first
返回结果:
一年奔波,尘缘遇了谁
一年奔波,尘缘遇了谁
- 只可以将数据存储到文本文件无法写入数据库
- 存储数据文件后缀是指定好的,通常使用.csv
- 需要将存储的数据封装到parse方法的返回值中
当前文件:D:\python_test\scrapyProject\scrapyProject\spiders\first.py
import scrapy
class FirstSpider(scrapy.Spider):
name = 'first'
start_urls = ['https://ishuo.cn/duanzi']
def parse(self, response):
list_li = response.xpath('//*[@id="list"]/ul/li')
data_list=[]
for li in list_li:
title = li.xpath('./div[2]/a/text()').extract_first()
dic ={
'title':title
}
data_list.append(dic)
return data_list
termail目录下()执行:scrapy crawl first -o data.csv
结果:
生成一个data.csv,保存了data_list数据
步骤从爬虫文件first.py开始看:
# 当前文件:D:\python_test\scrapyProject\scrapyProject\spiders\first.py
import scrapy
from ..items import ScrapyprojectItem
class FirstSpider(scrapy.Spider):
name = 'first'
start_urls = ['https://ishuo.cn/duanzi']
def parse(self, response):
# 第一步,数据解析
list_li = response.xpath('//*[@id="list"]/ul/li')
for li in list_li:
title = li.xpath('./div[2]/a/text()').extract_first()
content = li.xpath('./div[1]/text()').extract_first()
# 第二步,在items.py创建字段接受我们所需要的变量后导入,请打开items.py,然后将变量放到该items对象
items = ScrapyprojectItem()
items['item_title'] = title
items['item_content'] = content
# 第三步,将item对象传给管道(pipelines.py)
yield items
# 第四步,管道接受items对象,请打开pipelines.py
# 第五步,在管道文件pipelines.py重写父类的文件方法,写入数据,请打开pipelines.py
# 第六步,在setting.py设置管道机制打开,setting.py以下注释放开即可
'''
ITEM_PIPELINES = {'scrapyProject.pipelines.ScrapyprojectPipeline': 300,}
'''
# termail目录下()执行:scrapy crawl first
当前文件:D:\python_test\scrapyProject\scrapyProject\items.py
import scrapy
class ScrapyprojectItem(scrapy.Item):
# 第二步:创建字段接受我们所需要的变量
item_title = scrapy.Field()
item_content = scrapy.Field()
当前文件:D:\python_test\scrapyProject\scrapyProject\pipelines.py
有时为了例于记忆要改类名时,需要同步把setting.py的配置(ScrapyprojectPipeline)改成相同
ITEM_PIPELINES = {'scrapyProject.pipelines.ScrapyprojectPipeline': 300,}
class ScrapyprojectPipeline:
def open_spider(self, spider):
print('打开文件方法,项目运行开始时只会被执行一次!')
self.fp = open('items.txt', 'w', encoding='utf-8')
# process_item方法调用的次数等于爬虫文件提交item的次数
def process_item(self, item, spider):
# 请看first.py步骤描述,这里是第四步:接受item提交到这里的数据(字典形式)
title = item['item_title']
content = item['item_content']
self.fp.write(f'{title}:{content}\n')
return item
def close_spider(self, spider):
print('关闭文件方法,项目运行结束时只会被执行一次!')
self.fp.close()
增加并发:默认scrapy开启的并发线程为32个,可以适当进行增加。在settings配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100。
降低日志级别: 在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率。可以设置log输出信息为WORNING或者ERROR即可。在配置文件中编写:LOG_LEVEL = ‘ERROR’
禁止cookie:如果不是真的需要cookie,则在scrapy爬取数据时可以禁止cookie从而减少CPU的使用率,提升爬取效率。在配置文件中编写:COOKIES_ENABLED = False
禁止重试: 对失败的HTTP进行重新请求(重试)会减慢爬取速度,因此可以禁止重试。在配置文件中编写:RETRY_ENABLED = False
减少下载超时:如果对一个非常慢的链接进行爬取,减少下载超时可以能让卡住的链接快速被放弃,从而提升效率。在配置文件中进行编写:DOWNLOAD_TIMEOUT = 10 超时时间为10s
当前文件:D:\python_test\scrapyProject\loadImg\loadImg\spiders\first.py
import scrapy
class FanyiSpider(scrapy.Spider):
name = 'fanyi'
# allowed_domains = ['www.xxx.com']
start_urls = ['https://fanyi.baidu.com/sug']
#父类中方法:该方法是用来给起始的url列表中的每一个url发请求
def start_requests(self):
data = {
'kw':'dog'
}
for url in self.start_urls:
#formdata是用来指定请求参数
yield scrapy.FormRequest(url=url,callback=self.parse,formdata=data)
def parse(self, response):
result = response.json()
print(result)