首先,电脑上要安装了scrapy
如何安装,可以参考:https://blog.csdn.net/yctjin/article/details/70658811
新建文件夹,shift + 右键,选择在该处打开命令窗口,
键入 scrapy startproject 项目名称
稍等片刻,即可自动生成一个爬虫项目
文件夹结构应该是这样的:
我们需要自己手动建立上图中csdnBlog_spider.py。
spider是爬虫爬取后的页面解析等处理的地方
该文件的内容是;
包含了xpath和BeautifulSoup两种解析页面的方式
和简单的‘下一页’操作
# 作者:Voccoo
# 撰写时间:2018年8月27日
# Python版本:3.6.5
# CSDN:https://blog.csdn.net/qq_38044574
#
import scrapy
from bs4 import BeautifulSoup
from csdn_spider.items import CsdnSpiderItem
class CnBlogSpider(scrapy.Spider):
# 爬虫的名称,用于crawl 启动
name = 'csdn_spider'
# 限制爬取地址范围,只能爬取下面地址以内的网页
allowed_domains = ['cnblogs.com']
start_urls = [
'初始url地址'
]
# 爬虫运行开始后会自动调用parse方法
def parse(self, response):
# response为自动执行的第一个url后的返回结果
# 括号内容可以根据自己选择的分析网页工具填写,可以用xpath或者BSoup
parpers = response.xpath(".//*[@class='day']") # 返回的是个list集合
# BSoup
# soup = BeautifulSoup.get(response.text,'lxml')
# parper = soup.find('div',{"class":"day"}) #find返回的事class为day的div下的所有内容
# find_all,是查询相关条件下的所有有关的内容,返回的事list.
# get('src') 是获取地址,其他信息以此类推
# get_text() 获取的是文本内容
for parper in parpers:
# 通过遍历,将每个parper中的标题,url,时间和内容通过xpath选择出来,然后通过extract提取,选中【0】第一个
title = parper.xpath('规则').extract()[0]
url = parper.xpath('规则').extract()[0]
time = parper.xpath('规则').extract()[0]
content = parper.xpath('规则').extract()[0]
#通过form和import导入item,调用classItem,注意获取的值和需要存入的值要一一对应
item = CsdnSpiderItem(url=url, title=title, time=time, content = content)
#将item通过yield进行提交,scrapy会自动匹配相关的字段值
yield item
#下一页操作
#通过分析第一页里的response,得到下一页的url
next_page = ''
#判断next_page有没有值存在
#如果有,则通过yield scrapy.Request调用该url,callback是回调函数,调用parse函数解析,如果有其他方法,也可调用
#注意,url只能是一个str参数,不可以是其他类型
if next_page:
yield scrapy.Request(url = next_page,callback=self.parse)
'''
启动方法1:
根据启动方式的不同,UserAgent设置的位置也不同
如果是在cmd中启动,我们需要在settings.py中,设置UserAgent的内容,否则,就是scrapy默认头访问,很容易被阻拦
在爬虫的上级文件夹 shift + 鼠标右键,选择’在此处打开命令窗口‘,键入scrapy crawl 爬虫名字
启动方法2:
如果想在本页面直接启动
需要先引用
from scrapy.crawler import CrawlerProcess
可以使用
if __name__ =='__main__':
process = scrapy.CrawlerProcess({"User-Agent":"User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"})
process.crawl(CnBlogSpider)#括号里是类名
#或者
process.crawl('csdn_spider')
#二者是有些微区别的
process.start()
还有其他的启动方式,可以自行百度
'''
items.py是数据存储的容器,将spider中通过yield 提交的item包装成结构化数据。
内容是:
# 作者:Voccoo
# 撰写时间:2018年8月27日
# Python版本:3.6.5
# CSDN:https://blog.csdn.net/qq_38044574
#
import scrapy
class CsdnSpiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
url = scrapy.Field()
time = scrapy.Field()
content = scrapy.Field()
pipeline为数据处理模块:
其中包含了pymysql数据库的插入操作,和写入本地操作。
当与数据库进行交互的时候,一定要进行try,防止脏数据的产生
# -*- coding: utf-8 -*-
# 作者:Voccoo
# 撰写时间:2018年8月27日
# Python版本:3.6.5
# CSDN:https://blog.csdn.net/qq_38044574
#
import json
from scrapy.exceptions import DropItem
import pymysql
#数据处理页面
#可以与数据库交互,也可以写入到本地中
class CsdnSpiderPipeline(object):
#该方法是只要进入该类就会执行的方法
def __init__(self):
self.file = open('parper.json','w+')
'''
与mysql数据库进行交互
1.建立连接
self.db=pymysql.connect(host='ip',user = '用户名',password = '密码',db='数据库名',charset='utf-8')
2.获取游标
self.cursor = db.cursor()
:return
'''
#pipelines是Crapy框架中必定执行的方法
def process_item(self, item, spider):
#在spider中,我们已经将获取到的title等存入到了item中了,在这里可以直接调用item
if item['title']:
#判断有没有存在title,存在则将item变成字典类型然后写入到parper.json中
line = json.dump(dict(item) + '\n')
self.file.write(line)
return item
else:
#若不存在,将这条数据整个丢掉
#raise是我们可以自定义触发异常的关键字
raise DropItem('丢掉 title in %s' % item)
'''
与mysql数据库进行交互,记得要在这个部分进行try 操作,防止脏数据的出现
try:
3.建立sql语句
sql = 'insert into 表名 (title,url,times,content) value ({title},{url},{time},{content})'.format(**item)
4.执行sql语句
self.cursor.execute(sql)
#进行插入操作,记得要进行commit
#或者在打开数据库连接的时候,就设置autocommit=True
self.db.commit()
except:
#进行数据回滚,防止脏数据的出现
self.db.rollback()
print('sql执行出错:'+ sql)
finally:
5.关闭数据库
self.cursor.close()
:return
更复杂的增删改查也可以在这个地方进行操作,就看自己的想法了,我这是最基本的
'''
#数据处理涉及完毕后,我们需要在settings.py中进行激活,否则不会运行
#因为你在新建scarpy project的时候,settings中就会内置一些相关的启动内容,但有些内容需要手动启动,
#因为,框架给屏蔽了,就留取了最基本的几条
#将下面的内容,在settings.py中,去掉注释
#300这个数字是指最大运行数量
# ITEM_PIPELINES = {
# 'csdn_spider.pipelines.CsdnSpiderPipeline': 300,
# }
settings是配置信息的地方
在生成项目的时候,就会自动生成很多,但大部分都被屏蔽了,只留下了四条:
BOT_NAME = 'csdn_spider'
SPIDER_MODULES = ['csdn_spider.spiders']
NEWSPIDER_MODULE = 'csdn_spider.spiders'
ROBOTSTXT_OBEY = True
需要手动开启和设置的呦
#开启pipline
ITEM_PIPELINES = {
'csdn_spider.pipelines.CsdnSpiderPipeline': 300,
}
#设置访问指定url时的header(伪装)
USER_AGENT = 'User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'
middleware.py暂时没有用到,先不提,init也没用到,也不用写。
若想使用,直接复制相关模块的内容到自己新建立的工程下对应模块即可,都有详细的注释。
更改自定义导入文件的名称(大部分不用该)
html数据自定义获取的方式,需要填写(我都没写)
然后运行即可。
谢谢观看。
如果对你有帮助了,帮忙点个赞,谢谢。