广西网站建设营销公司,网站的开发与设计,网站建设工作自查报告,汕头模板网建站文章目录 前言一、开始准备1. 包管理和安装chrome驱动2. 爬虫项目的创建#xff08;举个栗子#xff09;3. setting.py的配置 二、代码演示1. 主爬虫程序2. 中间件的配置3. 定义item对象4. 定义管道 总结 前言
scrapy和selenium的整合使用 先定个小目标实现万物皆可爬#… 文章目录 前言一、开始准备1. 包管理和安装chrome驱动2. 爬虫项目的创建举个栗子3. setting.py的配置 二、代码演示1. 主爬虫程序2. 中间件的配置3. 定义item对象4. 定义管道 总结 前言
scrapy和selenium的整合使用 先定个小目标实现万物皆可爬我们是用scrapy框架来快速爬取页面上的数据它是自带并发的速度是可以的。但是一些ajax异步的请求我们不能这么爬取。我们要视同selenium来进行lazy loading也就是懒加载渲染到页面加载数据。 一、开始准备 1. 包管理和安装chrome驱动
首先你要安装以下包
pip install scrapy
pip install selenium 3.0.0
pip install pymysql
pip install bs4selenium新版本有bug用3.0的版本。chrome驱动的exe执行文件放到你项目的根目录即可。下载地址驱动
2. 爬虫项目的创建举个栗子
创建项目
scrapy startproject cnki您爬取的目标网站
scrapy genspider cnki https://www.cnki.net运行爬虫
# 运行不导出一般在pipelines做导出操作
scrapy crawl cnki
# 针对不同的选择可以导出为xlsx、json等格式文件
scrapy crawl demo -o demo.csv3. setting.py的配置
配置数据源如下
DB_HOST localhost
DB_PORT 3306
DB_USER root
DB_PASSWORD 123456
DB_DATABASE spider防止打印log日志信息
LOG_LEVEL WARNING配置USER_AGENT浏览器控制台找一个
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36配置DEFAULT_REQUEST_HEADERS浏览器控制台找一个
{User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36,Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8,Accept-Language: en,
}随机延迟
DOWNLOAD_DELAY 3
RANDOMIZE_DOWNLOAD_DELAYTrue中间件权重配置这些中间件给他打开 并且按照项目实际需求配置权重越小越先执行
SPIDER_MIDDLEWARES # 蜘蛛中间件
DOWNLOADER_MIDDLEWARES # 下载中间件
ITEM_PIPELINES # 管道二、代码演示
1. 主爬虫程序
初始化selenium 如果您不需要selenium可以忽略这个
def __init__(self, *args,**kwargs):option webdriver.ChromeOptions() # 实例化一个浏览器对象option.add_argument(--headless) # 添加参数option可以是headless--headless-headlessself.driver webdriver.Chrome(optionsoption) # 创建一个无头浏览器# self.driver webdriver.Chrome() # 创建一个无头浏览器time.sleep(3)super(CnkiSpider, self).__init__(*args, **kwargs)dispatcher.connect(self.close_driver,signals.spider_closed)定义开始请求页面 下面我只放了一个url其实可以定义一组的然后进行遍历一般是分页url使用 还有cookie、代理也可以在这里配置详情请看进去看源码不过一般在中间件配置
def start_requests(self):for url in self.start_urls:yield scrapy.Request(# 这里可以设置多个页面一般用于分页的urlurl,)关闭selenium一定要关掉
def close_driver(self):print(爬虫正在退出执行关闭浏览器哦)time.sleep(2)self.driver.quit()解析页面 这里就不多说八仙过海各显神通
def parse(self,response: HtmlResponse):
sel Selector(response)
dds sel.css(.journal .main-w1 dl dd)
for dd in dds:title dd.css(h6 a::attr(title)).extract_first()link dd.css(h6 a::attr(href)).extract_first()link response.urljoin(link)author dd.css(.baseinfo span #author::attr(title)).extract_first()abstract dd.css(.abstract::text).extract_first()count dd.css(.opts .opts-count li em::text).extract_first()count int(count)date dd.css(.opts .opts-count .date::text).extract_first()date date.split()[1]date datetime.datetime.strptime(date,%Y-%m-%d)rc Recommend()rc[title] titlerc[link] linkrc[author] authorrc[abstract] abstractrc[count] countrc[date] dateyield rc这里要注意我们yield可以返回不仅是item也可以是Request进行页面详情的请求套娃
yield Request(urllink, # 这是上面页面上的链接用来进一步请求callbackself.parse_detail, # 这是回调函数cb_kwargs{item:rc} # 这是把上面的item传递下来)2. 中间件的配置
针对selenium 没有selenium请忽略
class SeleniumDownloaderMiddleware:def process_request(self, request , spider):if spider.name cnki:spider.driver.get(request.url)time.sleep(2)print(f当前访问{request.url})spider.driver.refresh()time.sleep(3)return HtmlResponse(urlspider.driver.current_url,bodyspider.driver.page_source,encodingutf-8)SpiderMiddleware保持默认配置即可DownloaderMiddleware可以配置cookie和代理之类的。如
# 我自定义的解析cookie方法
def get_cookie_dict():cookie_str 填上你的cookiecookie_dict {}for item in cookie_str.split(;):key, value item.split(,maxsplit1)cookie_dict[key] valuereturn cookie_dict
COOKIES_DICT get_cookie_dict()# 这是DownloaderMiddleware这是自带的方法哈
def process_request(self, request : Request, spider):request.cookies COOKIES_DICTreturn None3. 定义item对象
用来接受爬虫到的数据
class Recommend(scrapy.Item):title scrapy.Field()author scrapy.Field()abstract scrapy.Field()link scrapy.Field()count scrapy.Field()date scrapy.Field()4. 定义管道
实现对数据库的导入你也可以写excel的
class RecommendPipeline:classmethoddef from_crawler(cls, crawler: Crawler):host crawler.settings[DB_HOST]port crawler.settings[DB_PORT]username crawler.settings[DB_USER]password crawler.settings[DB_PASSWORD]database crawler.settings[DB_DATABASE]return cls(host, port, username, password, database)def __init__(self, host, port, username, password, database):# 1、与数据库建立连接self.conn pymysql.connect(hosthost, portport, userusername, passwordpassword, databasedatabase,charsetutf8mb4)# 2、创建游标self.cursor self.conn.cursor()# 3、批处理需要的容器self.data []def process_item(self, item, spider):title item.get(title, )author item.get(author, )abstract item.get(abstract, )link item.get(link, )count item.get(count, )date item.get(date, )# 如果要实现批处理self.data.append((title,author,abstract,link,count,date))# 如果存够了10条就进数据库if len(self.data) 10:self._to_write_db()# 然后再清空self.data.clear()return itemdef close_spider(self, spider):# 如果最后不满足10条if len(self.data) 0:self._to_write_db()self.conn.close()def _to_write_db(self):# 作为一个实时的推荐我希望将查到的数据作为一个temp# delete from tb_recommend where 1 1 删除满并且主键自增不会从1开始self.cursor.execute(truncate table tb_recommend)self.cursor.executemany(insert into tb_recommend (title,author,abstract,link,count,date) values (%s, %s, %s, %s, %s, %s),self.data)self.conn.commit()记得写入setting.py设置其权重。 *接下来您就可以按照这种方法‘愉’ ‘快’的进行爬虫啦 *
总结
这是scrapy和selenium的具体整合使用scrapy框架的内容还有很多方法还没用到都有待开发。其次就是selenium的填充之类的操作还没有使用还需要去复习selenium的api。