这个实例是获取(英语点津)里每一条文章里的信息http://language.chinadaily.com.cn/thelatest保存为csv文件
分析网页
我们要先分析网页结构,获取每条文章的链接地址,发现这个三个的链接地址是一样,所以获取哪个标签下的链接地址都可以,每一页有15条数据,共有293页
然后点击一条链接里去看需要爬取的信息,我们获取文章标题、发布者和时间、文本内容3个信息
创建scrapy项目
打开pycharm的Terminal,输入scrapy startproject english
(scrapy startproject 项目名)
进入刚刚创建的Scrapy项目目录下 cd english
(cd 项目名)
输入scrapy
可以查看操作指令
创建好了项目之后我们可以看到一个项目文件
修改settings.py文件
找到ROBOTSTXT_OBEY改为Flase
找到ITEM_PIPELINES打开注释
编写spider
创建爬虫文件scrapy genspider english_sp chinadaily.com.cn
(scrapy genspider 文件名 域名),爬虫文件会保存在spiders目录下
编写爬虫代码
打开刚刚创建的english_sp.py文件
修改start_urls
# 我们需要获取293页数据
start_urls = ['http://language.chinadaily.com.cn/thelatest/page_{}.html'.format(page) for page in range(1, 294)]
编写parse方法
def parse(self, response):
# 使用xpath获取每个新闻的url地址
urls = response.xpath('//a[@class="gy_box_img"]/@href')
for url in urls: # 遍历获取到的url
data_url = url.get().replace('//', 'http://')
# 把获取的url地址去发送新的请求,响应数据给到parse_text方法去解析
yield scrapy.Request(url=data_url, callback=self.parse_text)
编写parse_text方法
def parse_text(self, response):
"""
数据解析
:param response: 网页响应内容
"""
# 标题
title = response.xpath('//div[@class="main_title"]/h1/span[@class="main_title1"]/text()').get()
# 作者和时间
are = response.xpath('normalize-space(//div[@class="main_title"]/p[@class="main_title3"]/text())').get()
# 获取指定div标签下的所有p标签的文本信息, 注意返回的是每个p标签信息的列表
text = response.xpath('//div[@class="mian_txt"]/p//text()').getall()
# 文章内容
text_all = ''
# 将列表中所有的内容合并,并去除\xa0
for strs in text_all:
if strs != '\xa0':
text += strs
item = EnglishItem(title=title, are=are, text=text)
yield item
english_sp.py完整代码如下
import scrapy
from ..items import EnglishItem
class EnglishSpSpider(scrapy.Spider):
name = 'english_sp'
allowed_domains = ['chinadaily.com.cn'] # 限制域名
# 我们需要获取293页数据
start_urls = ['http://language.chinadaily.com.cn/thelatest/page_{}.html'.format(page) for page in range(1, 294)]
def parse(self, response):
# 使用xpath获取每个新闻的url地址
urls = response.xpath('//a[@class="gy_box_img"]/@href')
for url in urls: # 遍历获取到的url
data_url = url.get().replace('//', 'http://')
# 把获取的url地址去发送新的请求,响应数据给到parse_text方法去解析
yield scrapy.Request(url=data_url, callback=self.parse_text)
def parse_text(self, response):
"""
数据解析
:param response: 网页响应内容
"""
# 标题
title = response.xpath('//div[@class="main_title"]/h1/span[@class="main_title1"]/text()').get()
# 作者和时间
are = response.xpath('normalize-space(//div[@class="main_title"]/p[@class="main_title3"]/text())').get()
# 获取指定div标签下的所有p标签的文本信息, 注意返回的是每个p标签信息的列表
text = response.xpath('//div[@class="mian_txt"]/p//text()').getall()
# 文章内容
text_all = ''
# 将列表中所有的内容合并,并去除\xa0
for strs in text_all:
if strs != '\xa0':
text += strs
item = EnglishItem(title=title, are=are, text=text)
yield item
编写items.py
import scrapy
class EnglishItem(scrapy.Item): # 数据管道
title = scrapy.Field()
are = scrapy.Field()
text = scrapy.Field()
编写pipelines.py
import csv
class EnglishPipeline:
def __init__(self):
self.f = open('data.csv', mode='a', encoding='utf-8', newline='')
self.csv_write = csv.DictWriter(self.f, fieldnames=['title', 'are', 'text'])
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项目
回到Terminal输入scrapy crawl english_sp
(scrapy crawl 爬虫文件名称)
大约3分钟后爬取完毕(爬取速度和电脑性能、网页响应速度有关,也可以自己修改settings.py文件配置提高爬取速度)
项目文件目录下会出现data.csv文件
大约有4393条数据
有些图有马赛克是因为太严了,望理解
大家有什么问题欢迎留言!