第一步,本地创建文件并下载。(注意pip改国内的,不会自行百度,我没时间)
第二步,测试是否下载成功
第三步,检测正确性
出现这样的,说名没问题。
第四步,通过指令创建文件
scrapy startproject qd_english #qd_english是文件名
创建成功
第五步,关闭爬虫协议
第六步,
创建爬取
scrapy genspider english chinadaily.com.cn
练习网站 http://language.chinadaily.com.cn/thelatest
其中 chinadaily.com.cn是网站域名,english是文件名
第七步,修改内部参数
import scrapy
class EnglishSpider(scrapy.Spider):
name = 'english'
allowed_domains = ['chinadaily.com.cn'] #域名
start_urls = ['http://language.chinadaily.com.cn/thelatest'] #修改成需要爬取的url
def parse(self, response):
print(response.text)
启动
scrapy crawl english
获取源码成功
第八步,使用xpath提取标签
def parse(self, response):
divs=response.xpath("")
for div in divs:
title=div.xpath("").get()
title1 = div.xpath("").get()
title2 = div.xpath("").get()
title3= div.xpath("").get()
title4 = div.xpath("").get()
def parse(self, response):
divs=response.xpath("//div[@class='content_left']/div[@class='gy_box']")
for div in divs:
title=div.xpath(".//div[@class='content_left']//div[@class='gy_box_txt']/p[1]/text()").get()
title1 = div.xpath(".//div[@class='gy_box_txt']/p[2]/text()").get()
title2 = div.xpath(".//div[@class='gy_box_txt']/p/a/@href").get()
title3= div.xpath(".//div[@class='content_left']//div[@class='gy_box']/a/img/@src").get()
完成后,转到item文件
导入数据
import scrapy
from ..items import QdEnglishItem
class EnglishSpider(scrapy.Spider):
name = 'english'
allowed_domains = ['chinadaily.com.cn'] #域名
start_urls = ['http://language.chinadaily.com.cn/thelatest'] #修改成需要爬取的url
def parse(self, response):
divs=response.xpath("//div[@class='content_left']/div[@class='gy_box']")
for div in divs:
title=div.xpath(".//div[@class='content_left']//div[@class='gy_box_txt']/p[1]/text()").get()
title1 = div.xpath(".//div[@class='gy_box_txt']/p[2]/text()").get()
title2 = div.xpath(".//div[@class='gy_box_txt']/p/a/@href").get()
title3= div.xpath(".//div[@class='content_left']//div[@class='gy_box']/a/img/@src").get()
itme = QdEnglishItem(title=title,title1=title1,title2=title2,title3=title3)
yield itme
传入爬取参数
第九步,保存数据,前面步骤都完成才可。
保存格式,这里涉及到了python面向对象的知识,看不懂可以先补补面向对象,也可以套用,改几个名字就行。
import csv
from itemadapter import ItemAdapter
class QdEnglishPipeline:
def __init__(self):
self.f = open('data.csv',mode='a',encoding="utf-8",newline='')
self.csv_write=csv.DictWriter(self.f,fieldnames=['title','title1','title2','title3'])
self.csv_write.writeheader()
def process_item(self,item,spider):
self.csv_write.writerow(dict(item))
return item
def close_file(self):
self.f.close()
打开保存配置
第十步,运行。scrapy是一个框架,所以只能在整体请求之后,报错才能修改,无法局部执行。
scrapy crawl english
哈哈哈,崩。
定位错误,让我瞅瞅。
for div in divs:
title=div.xpath(".//div[@class='gy_box_txt']/p[1]/a/text()").get()
title1 = div.xpath(".//div[@class='gy_box_txt']/p[2]/a/text()").get()
title2 = div.xpath(".//div[@class='gy_box_txt']/p[1]/a/@href").get()
title3 = div.xpath(".//a/img/@src").get()
成果
第十一步,翻页提取,利用格式化翻页。
start_urls = ['http://language.chinadaily.com.cn/thelatest/page_{}.html'.format(i) for i in range(1,50)]
如果求情失败,可能是没有添加headers头.
在settings里面开启DEFAULT_REQUEST_HEADERS,根据需求设置相关内容即可,主要就是配置"User-Agent"。
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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36",
}
管道持续保存
def open_spider(self,spider):
print("开始数据爬取")
self.fp = open('./yangougou.txt','w',encoding='utf-8')
def process_item(self,item,spider):
tit=item['tit']
self.fp.write(tit)
return item
def close_spider(self,spider):
print("数据抓取结束")
self.fp.close()
最后。求一波关注。