声明:仅供技术交流,请勿用于非法用途,如有其它非法用途造成损失,和本博客无关
爬取的网站:东莞阳光网问政平台中的投诉页面 点击跳转
python3.7
pycharm
Scrapy1.7.3
win10
pymysql
scrapy startproject tutorial
cd yg
scrapy genspider yg sun0769.com
yg.py
爬虫文件
可以看到,这是一个很简单的网页而已,非常容易爬取数据,在这个页面我只想要它的标题以及标题对应详情页面的url
和时间,然后随便进入其中一个标题内容的详情页面,如下:
然后这个详情页面我只想要它的文本内容,即提问的这个人所写的具体信息。不过可以发现有一些会有上传图片,例如:
那么我也想把它的图片拿下来,这里我只把图片的url
爬取下来了
所以总共我要爬取的内容有:
url
地址url
地址在此,我们在yg
项目目录下的item.py
文件里可以先定义如下:
import scrapy
class TutorialItem(scrapy.Item):
title = scrapy.Field() #标题
url = scrapy.Field() #标题详情页面url
date = scrapy.Field() #时间
img_url = scrapy.Field() #图片url
content = scrapy.Field() #内容
可以说item.py
文件在scrpy框架爬虫中是最简单好写的一个,没有之一,并且我感觉它是可有可无的,因为你可以在爬虫文件中自己定义一个item变量字典用来保存爬取的数据,都是一样的结果,只是用item.py
会显的更加装13专业一点,哈哈
查找元素的那些操作我就不放上来了,因为没什么难度的,会来学scrapy
框架的同学肯定是跟我一样那些什么requests
啊,urllib
啊,selenium
啊等等都是用腻了才来的,是吧
下面直接放上yg.py
的代码:
# -*- coding: utf-8 -*-
import scrapy
from tutorial.items import TutorialItem #需要导入item文件中的创建的类
class YgSpider(scrapy.Spider):
name = 'yg'
allowed_domains = ['sun0769.com']
start_urls = ['http://d.wz.sun0769.com/index.php/question/questionType?type=4']
def parse(self, response):
tr_list=response.xpath('//div[@class="greyframe"]/table[2]/tr/td/table/tr')
for tr in tr_list:
item=TutorialItem()
item['title']=tr.css('a::attr(title)').get()
item['url']=tr.css('a::attr(href)')[1].get()
item['date']=tr.xpath('./td[last()]/text()').get()
#下面是发送去详情页面的请求
yield scrapy.Request(
item['url'],
callback=self.parse_detail, #让返回的response交给这个函数处理,注意:不要带上括号
meta={'item':item} #并且把上面爬到的标题等内容一起传过去
)
#下面是进行翻页的操作
next_page=response.xpath('//a[text()=">"]/@href').get()
if next_page is not None:
yield scrapy.Request(next_page,callback=self.parse)
def parse_detail(self,response):
item=response.meta['item'] #接受传进来的item
item['content']=response.xpath('//td[@class="txt16_3"]/text()').getall()
item['img_url']=response.xpath('//td[@class="txt16_3"]//img/@src').getall()
#下面处理图片url
item['img_url']=['http://wz.sun0769.com' + i for i in item['img_url']]
item['img_url']=''.join(i for i in item['img_url'])
yield item #会传给pipeline.py进行保存数据的操作
保存数据是交给pipeline.py
文件进行操作的
这里我把数据保存到了mysql
数据库中,如果没有安装pymysql
的,可以在cmd命令下执行pip install pymysql
来安装一下即可
然后pipeline.py
文件的代码如下:
# -*- coding: utf-8 -*-
import pymysql
class TutorialPipeline(object):
#爬虫开始时运行的函数
def open_spider(self,spider):
print('爬虫开始...')
conn = pymysql.connect(host='localhost', user='youruser', password='yourpassword', database='yourdatabase', charset='utf8')
cursor = conn.cursor()
#接收传入的item,来进行数据的存储
def process_item(self, item, spider):
if spider.name == 'yg':
item['content']=self.process_content(item['content'])
title=item['title']
url=item['url']
date=item['date']
content=item['content']
img_url=item['img_url']
sql='insert into yg(title,url,date,content,img_url) values(%s,%s,%s,%s,%s)'
cursor.execute(sql, [title,url,date,content,img_url])
conn.commit()
#因为传进来的content需要清洗处理一下,因此定义下面的函数
def process_content(self,content):
content=[re.sub(r"\xa0|\s","",i) for i in content]
content=[i for i in content if len(i)>0]
content=[i.strip() for i in content]
content=''.join(i for i in content)
# content=''.join(content).strip()
return content
#爬虫结束后会运行的函数
def close_spider(self,spider):
print('爬虫结束...')
cursor.close()
conn.close()
现在我们的爬虫大致已经是写完了,不过我还要修改一下setting.py
文件的一些设置,需要增加的语句有:
LOG_LEVEL='WARNING' #设置日志输出级别
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36' #设置请求头
ROBOTSTXT_OBEY = False #把这个设置成False,就不会去请求网页的robots.txt,因为不改为False的话,scrapy就会去访问该网站的robots.txt协议,如果网站没有这个协议,那么它就不会去访问该网站,就会跳过,进而爬不到数据
ITEM_PIPELINES = {
'tutorial.pipelines.TutorialPipeline': 300, #打开刚刚设置的pipeline.py
}
最后在cmd中先进入到这个项目的根目录下,即有scrapy.cfg
文件的目录下,然后输入并运行scrapy crawl yg
,最后静静等待就行了
到现在为止,我接触python
爬虫也差不多有半年了吧,不是接触,是开始学,因为之前都没有爬取过数据,都在做数据分析的工作。然后呢,一开始我就从图书馆借了几本python
爬虫的书来看,都是一些比较基础的入门级别的书,当时还有课,只是在空闲的时间里学,偶尔在一些比较无聊的课的时候会带过去看,也不知道为什么,看着看着就觉得很有趣,就会去敲敲代码自己爬一下玩玩,爬着爬着就好像懂得了一些爬虫的原理吧,于是趁着放暑假,就从图书馆又借了几本发布时间不久的比较新的系统一点的书,回到家就把那几本书给看完了,并且是一个案例都不放过的那种,从一开始的urllib
到requests
,再到selenium
,全部都学完了,也不是学完吧,就大致都知道怎么用,也可以很好的结合在一起使用,现在是运用自如。最近呢,想了想,好像还差点什么东西,是什么呢,毫无疑问就是框架啊,到现在我一个爬虫的框架都没有学过,于是就开始学非常非常热门的scrapy
了,也学了有一段时间了,没算错的话应该有3个星期了。然后呢,学到现在,大概是知道了scrapy
的一些原理,以及怎么使用它了,也知道了它的一些优点和缺点。又因为最近时间有点儿充裕,而且朋友也问我为什么不写写博客之类的啊,记录一下也好啊。于是乎,就有了这一篇文章。后续我会继续写scrapy
的一些爬虫案例,并且记录一下当下的一些心得体会,与大家分享一下。