目录
流程:
1)新建项目 进入项目——> 2)新建爬虫文件 并调整全局配置setting ——>3)明确抓取的内容,写item而且将item类型对象提交给管道,进行储存操作——> 4)写爬虫程序,爬取数据——> 5)交给管道处理数据——> 6)执行爬虫程序,可以通过终端或者在程序里写一个run程序
1)打开一个终端输入(比如我的d盘下的文件 cd+地址)
cd D:\pycharm_project\爬虫\scrapy操作
1.初始化项目
scrapy startproject xxxxx(项目名)
eg:scrapy startproject qiubaipro
2.cd到项目路径
cd xxxx(项目名)
eg:cd qiubai
3.生成一个py文件
scrapy genspider xxxx(文件名) www.xxx.com(随便一个网站)
eg:scrapy genspider qiubai v.qq.com
2.修改setting
ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 1
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 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36'
}
ITEM_PIPELINES = {
'TXmovies.pipelines.TxmoviesPipeline': 300,
}
1.修改三项内容,第一个是不遵循机器人协议,ROBOTSTXT_OBEY = False
2.第二个是下载间隙,由于下面的程序要下载多个页面,所以需要给一个间隙(不给也可以,只是很容易被侦测到) DOWNLOAD_DELAY = 1
3.第三个是请求头,添加一个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 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36'
}
4.第四个是打开一个管道
300表示优先级 ,数值越小优先级越高ITEM_PIPELINES = {
'TXmovies.pipelines.TxmoviesPipeline': 300,
}5.setting.py里面可以设置日志的等级与日志存放的路径
LOG_LEVEL="ERROR"
3)确认要提取的数据,item项
item定义你要提取的内容(定义数据结构),比如我提取的内容为a描述,我就创建两个变量。
Field方法
实际上的做法是创建一个字典,给字典添加一个建,暂时不赋值,等待提取数据后再赋值。下面item的结构可以表示为:{'a':''}
spiders文件下 name就是我们item类型对象
import scrapy
class TxmoviesItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
a = scrapy.Field()
4.写爬虫程序
yield
yield item#将item提交给管道
xpath
在qiubai.py下
有一个要注意的是如何提取xpathl里的数据,我们的写法有四种,第一种写法拿到selector选择器,也就是原数据,里面有一些我们用不到的东西。第二个extract(),将选择器序列号为字符串。第三个和第四个一样,拿到字符串里的第一个数据,也就是我们要的数据。
items['name']=i.xpath('./a/@title')[0]
items['name']=i.xpath('./a/@title').extract()
items['name']=i.xpath('./a/@title').extract_first()
''' 解析作者名称和段子内容 xpath返回的是列表,但是列表元素一定是selector类型的对象 extract将对象值从selector取出 '''
5.交给管道输出
先设置通道
class QiubaiproPipeline:
fp = None
#重写父类的方法,该方法只在开始爬虫时被调用
def open_spider(self,spider):
print("开始爬虫")
self.fp = open('./qiubai.txt','w',encoding='utf-8')
#专门用来处理item类型对象
#该方法可以接受爬虫文件提交的item对象
#该方法每接收一次就调用一次
def process_item(self, item, spider):
a = item['a']#取出a
self.fp.write(a)
return item
def close_spider(self,spider):
print("结束爬虫")
self.fp.close()
管道可以处理提取的数据,如存数据库。我们这里仅输出
def parse(self, response):
'''
解析段子内容
xpath返回的是列表,但是列表元素一定是selector类型的对象
extract将对象值从selector取出
'''
a = response.xpath('/html/body/div[@id="content"]/div[@class="content-block clearfix"]/div[@class="col1 old-style-col1"]/div[@id="qiushi_tag_124969920"]/a[@class="contentHerf"]/div[@class="content"]/span').extract()
item = QiubaiproItem()
item['a'] = a
yield item#将item提交给管道
6.run,执行项目
在终端上
scrapy crawl qiubai(爬虫名)
结果: