基于Python的网络爬虫总结

您所在的位置:网站首页 python信息爬取项目报告总结模板怎么写 基于Python的网络爬虫总结

基于Python的网络爬虫总结

2024-02-27 00:12| 来源: 网络整理| 查看: 265

心得体会

本人在大二时自学过一些爬虫知识,对爬虫已经有了一定程度的了解,到了大三的时候专业开了相应的网络爬虫课,学到了更多的相关知识和技术,并对爬虫有了更加深入的认识,在学习爬虫的过程中有一些自己的心得体会。 (1)多实践。在上课的时候要跟着老师演示的步骤自己实践,看会了不等于自己会操作,一定要自己多动手去实际操作。 (2)构建整体的知识框架。在学习的时候首先要了解python的每个模块具体可以实现什么功能,而不是去死记硬背地去记代码,在遇到具体业务逻辑的时候要知道用什么模块,之后可以去查该模块具体的用法,甚至复制粘贴自己写过的代码或者别人的代码,避免自己造“轮子”的过程。 (3)了解整体业务流程和逻辑。在写代码时首先要了解整体的业务流程框架,之后对每个流程 进行细化、编写对应的代码、实现对应的功能。 (4)学会解决问题。在代码报错的时候根据报错信息和实际的业务逻辑找到错误所在,也可以把报错信息复制粘贴到百度去查找解决方案。不要害怕出错,在不断试错的过程中不断积累经验,解决错误后会对问题有更深刻的理解,遇见错误到解决错误的过程就是学习和进步的过程。 (5)写博客。通过写博客的方式记录自己的学习过程,把自己学习过程中遇到的问题和如何解决问题的过程记录下来,在写博客的过程中就是复习知识和加深印象的过程,在写的过程中把自己含糊不清的知识理清,会对知识有一个更透彻的认识和理解,并且方便日后复习。

爬虫相关的基本Python模块 requests

requests库是一个简洁的能够简单地处理HTTP请求的第三方库,其中,get()是获取网页最常用的方法,在调用requests.get()函数后,返回网页内容会保存成为一个Response对象,其中get()函数的参数url链接必须采用HTTP或者HTTPS的方式访问。

bs4

bs4 全名 BeautifulSoup,是编写 python 爬虫常用库之一,主要用来解析 html 标签。常用的方法为BeautifulSoup(“A Html Text”, “html.parser”),其中的两个参数:第一个参数是要解析的html文本,第二个参数是使用那种解析器,对于HTML来讲就是html.parser,这个是bs4自带的解析器。

pandas

该模块是用于数据分析任务的。其中纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。在爬虫应用中,该模块可将爬取到的数据转换为DataFrame,用于后续往数据库里插入数据

selenium

Selenium是一个Web的自动化测试工具,可以按指定的命令自动操作。Selenium也可以根据的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生等。

sqlalchemy

是Python SQL工具包和对象关系映射器,是Python中最著名的ORM(Object Realationship Mappin)框架,它简化SQL上的操作,使开发人员将主要精力都放在程序逻辑上,从而提高开发效率。其中sqlalchemy.create_engine(*args,**kwargs):创建数据库实例,常用参数: Engine:用URL的方式填写连接数据库所需的数据:格式:db=create_engine(‘mysql+pymysql://数据库用户:数据库密码@127.0.0.1:3306/数据库名?charset=utf8’) case_sensitive=True:如果为False,在查询获取列名时将不区分大小写 connect_args :值是一个字典,用于设置数据库连接参数,连接数据库时可以传递自定义参数。

pymongo

是Python中用来操作MongoDB的一个库,可以建立连接,指定数据库、集合,常用函数为client = pymongo.MongoClient(‘127.0.0.1’,27017)。

pymsql

pymysql是从Python连接到MySQL数据库服务器的接口。 它实现了Python数据库APIv2.0,并包含一个纯Python的MySQL客户端库,连接数据库时常使用 pymsql.connect() 函数。

json

将抓取到的数据转换为json格式(往MongeDB中插入数据时要字典格式),插入MongoDB数据库

dateparser

是一个智能且高性能的日期解析器库,在抓取日期数据时可以用来解析日期。

scrapy

Scrapy是适用于Python的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。Scrapy包含几个基本模块,如下所述。 调度器(Scheduler):可理解为一个URL(抓取网页的网址或者说是链接)的优先队列,由它来决定下一个要抓取的网址是什么,同时去除重复的网址(不做无用功)。用户可以自己的需求定制调度器。 下载器(Downloader):是所有组件中负担最大的,它用于高速地下载网络上的资源。Scrapy 的下载器代码不会太复杂,但效率高,主要的原因是 Scrapy 下载器是建立在 twisted 这个高效的异步模型上的(其实整个框架都在建立在这个模型上的)。 爬虫(Spider):是用户最关心的部份。用户定制自己的爬虫,用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。例如使用 Xpath 提取感兴趣的信息。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面。 实体管道(Pipeline):用于接收网络爬虫传过来的数据,以便做进一步处理。例如验证实体的有效性、清除不需要的信息、存入数据库(持久化实体)、存入文本文件等。 Scrapy 引擎(Scrapy Engine):是整个框架的核心,用来处理整个系统的数据流,触发各种事件。它用来控制调试器、下载器、爬虫。实际上,引擎相当于计算机的CPU,它控制着整个流程。 中间件(Middleware):整个 Scrapy 框架有很多中间件,如下载器中间件、网络爬虫中间件等,这些中间件相当于过滤器,夹在不同部分之间截获数据流,并进行特殊的加工处理。

urllib

用于操作网页 URL,并对网页的内容进行抓取处理。常用模块有urllib.request - 打开和读取 URL;urllib.parse - 解析 URL

Xpath

Xpath 是一种用在 XML 文档中定位元素的语言,同样也支持 HTML 元素的解析,提供用户在数据结构树中寻找节点的功能(相比于正则表达式更简单方便)。

PyMuPDF

PyMuPDF是一个用来操作PDF文档的Python包,功能比较强大,不依赖其他的Python包,除了提供方便易用的功能外,还提供了一些底层的操作方法。使用PyMuPDF,可以访问扩展名为“.pdf”、“.xps”、“.oxps”、“.cbz”、“.fb2”或“.epub”。此外,大约10种流行的图像格式也可以像文档一样处理:“.png”,“.jpg”,“.bmp”,“.tiff”等。

gerapy

用于爬虫框架项目部署,将通过Scrapy爬虫框架写好的项目整合到Django的Web环境进行统一管理的后台。简单整理为一个Admin后台进行控制写好的爬虫脚本,进行有针对性的网络数据采集(比如固定时间、固定间隔、或者一次性采集),并对项目进行简单的项目管理。

scrapyd

Scrapyd是一个用来部署和运行Scrapy项目的应用,可以用来管理多个项目。在安装并开启Scrapyd之后,它将会挂起一个服务来监听运行爬虫的请求,并且根据请求为每一个爬虫启用一个进程来运行。Scrapyd同样支持同时运行多个进程

简单爬虫脚本的编写

实验内容:用anaconda的Jupyter Notebook抓取指定网页的内容,并将数据存入MongoDB数据库

在anaconda的Jupyter Notebook中新建一个Python文件,添加如下爬虫代码。

#导入相关的库 import requests from bs4 import BeautifulSoup import pandas as pd #访问页面信息 url="http://health.people.com.cn/GB/408568/index.html"#目标网址 html=requests.get(url) #请求访问网址 html.encoding="GB2312" #编码方式 soup = BeautifulSoup(html.text,'lxml') #解析得到的网页信息 #获取文章信息 list=[] for i in soup.find_all("div",class_="newsItems"): title=i.a.text #文章标题 date=i.div.text #文章日期 urll = i.a["href"] #相对路径 list.append((title,date,url+urll)) #添加到文章信息列表 #获取文本链接列表 text_url_list=[] for u in list: text_url_list.append(url+u[2]) #将根路径与相对路径拼接后加入文本链接列表 #获取文本列表 text_list=[] for u in text_url_list: html2=requests.get(u) html2.encoding="GB2312" soup2 = BeautifulSoup(html2.text,'lxml') text=soup2.find("div",class_="artDet").text text_list.append((text)) #将数据转换成DataFrame df = pd.DataFrame(list,columns=["title","date","url"]) df2 = pd.DataFrame(text_list,columns=["text"]) #将数据写入MongoDB数据库 import pymongo #导入操作MongoDB数据库的库 import json client = pymongo.MongoClient('127.0.0.1',27017) #连接MongoDB数据库(要先开启MongoDB服务) database = client["NewsData"] #设置数据库名称 table = database["News"] #设置数据库表单 data_ = json.loads(df.T.to_json()) #将抓取的数据转为json格式(往MongoDB中插入数据时需要字典格式) table.insert_many(data_.values()) #往数据库表单中插入数据

在数据库可视化工具(Navicat)中查看抓取并存入MongoDB数据库中的数据: MongoDB数据库中的数据

Scrapy爬虫框架的使用

实验内容:用Scrapy爬虫框架抓取指定网页的内容,并将数据存入MongoDB数据库。

创建Scrapy项目

(1)安装scrapy 在命令窗口输入pip install scrapy (2)新建一个scrapy框架文件夹 (3)创建scrapy项目 进入创建的scrapy框架文件夹,打开命令窗口,输入 scrapy startproject NewsData ,之后在scrapy框架文件夹中会出现NewsData项目文件夹。 在这里插入图片描述(4)查看scrapy框架文件的目录结构 在命令行输入 tree /f 在这里插入图片描述(5)创建爬虫文件 在NewsData项目文件的命令窗口中输入 scrapy genspider news " ",在spiders中会生成news爬虫文件。

在这里插入图片描述下面介绍利用Pycharm对NewsData中的各文件进行修改。

items.py import scrapy class NewsdataItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() url = scrapy.Field() # 网站连接 site = scrapy.Field() # 网站名称 category = scrapy.Field() # 类别 text_url = scrapy.Field() #文章连接 title = scrapy.Field() # 文章标题 content = scrapy.Field() # 文章正文 stu_id=scrapy.Field() # 学号 pass

在该文件中定义一个NewsdataItem类,在该类中设置需要抓取的字段。

middlewares.py from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware from scrapy.utils.project import get_project_settings import random settings = get_project_settings() class RotateUserAgentMiddleware(UserAgentMiddleware): def process_request(self, request, spider): referer = request.url if referer: request.headers["referer"] = referer USER_AGENT_LIST = settings.get('USER_AGENT_LIST') user_agent = random.choice(USER_AGENT_LIST) if user_agent: request.headers.setdefault('user-Agent', user_agent) print(f"user-Agent:{user_agent}")

该文件为scrapy框架的中间件,可以实现自定义requests请求、下载扩展和进行response过滤等功能。process_request为默认方法,每当request通过下载中间件时该方法被调用,把返回的对象通过引擎交给调度器处理。在该文件中添加以上代码,用来添加Header和IP类,其中USER_AGENT_LIST在settings.py中设置,user_agent为USER_AGENT_LIST中随机的一个。

pipelines.py import pymongo from scrapy.utils.project import get_project_settings settings = get_project_settings() class NewsdataPipeline: # class中全部替换 def __init__(self): host = settings["MONGODB_HOST"] port = settings["MONGODB_PORT"] dbname = settings["MONGODB_DATABASE"] sheetname = settings["MONGODB_TABLE"] username = settings["MONGODB_USER"] password = settings["MONGODB_PASSWORD"] # 创建MONGODB数据库链接 client = pymongo.MongoClient(host=host, port=port) # 指定数据库 mydb = client[dbname] # 存放数据的数据库表名 self.post = mydb[sheetname] def process_item(self, item, spider): data = dict(item) # 数据写入 self.post.insert_one(data) return item

该文件为实体管道,用于接收引擎传过来的数据,以便做进一步处理。例如验证实体的有效性、清除不需要的信息、存入数据库(持久化实体)、存入文本文件等。在该文件中添加以上代码,用来添加必备的包和加载设置。在NewsdataPipeline类中设置MongDB数据库的主机名、端口号、数据库名称、表单名,并将网络爬虫传过来的数据写入MongoDB数据库。

settings.py BOT_NAME = 'NewsData' #设置scrapy项目名 SPIDER_MODULES = ['NewsData.spiders'] #设置Scrapy搜索spider的模块列表 NEWSPIDER_MODULE = 'NewsData.spiders' #设置spider的模块 #ROBOTSTXT_OBEY设置为False(不遵守机器人协议) ROBOTSTXT_OBEY = False #设置下载中间件 DOWNLOADER_MIDDLEWARES = { 'NewsData.middlewares.RotateUserAgentMiddleware': 543, } #开启管道 ITEM_PIPELINES = { 'NewsData.pipelines.NewsdataPipeline': 300, } #设置用户代理列表 USER_AGENT_LIST = [ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1", "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5", "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24" ] # 添加MONGODB数仓设置 MONGODB_HOST = "localhost" # 数仓IP MONGODB_PORT = 27017 # 数仓端口号 MONGODB_DATABASE = "NewsData" # 数仓数据库 MONGODB_TABLE = "News_Process_B" # 数仓数据表单

该文件是项目的配置文件

编写完以上几个文件后开始编写爬虫代码实现目标网址内容的抓取:

目标网站列表:

目标网址列表

news.py import scrapy from bs4 import BeautifulSoup from NewsData.items import NewsdataItem class NewsSpider(scrapy.Spider): name = 'news' allowed_domains = [] start_urls = [ ['https://www.yzs.com/zhongshitoutiao/',"中诗网","中诗头条","20201902"], ['https://www.yzs.com/zhgshg/', "中诗网", "中国诗歌","20201902"], ['https://www.yzs.com/zhongshizhuanti/', "中诗网", "中诗专题","20201902"], ['https://www.yzs.com/wenrenshuhua/', "中诗网", "文人书画","20201902"], ['https://www.yzs.com/zhongshitekan/', "中诗网", "中诗特刊","20201902"], ['https://www.yzs.com/shigewanlixing/', "中诗网", "诗行天下","20201902"], ['https://www.yzs.com/zhgshg/index_2.html', "中诗网", "中诗图书","20201902"], ['https://www.yzs.com/zhgshg/index_3.html', "中诗网", "中诗论坛","20201902"], ['https://www.yzs.com/zhgshg/index_4.html', "中诗网", "中诗网络","20201902"], ['https://www.yzs.com/zhgshg/index_5.html', "中诗网", "中诗高地","20201902"], ['https://www.yzs.com/zhgshg/index_6.html', "中诗网", "诗情画意","20201902"], ['https://www.yzs.com/zhgshg/index_7.html', "中诗网", "如诗如画","20201902"], ['https://www.yzs.com/zhgshg/index_8.html', "中诗网", "红叶题诗","20201902"], ['https://www.yzs.com/zhgshg/index_9.html', "中诗网", "诗有别才","20201902"], ['https://www.yzs.com/zhgshg/index_10.html', "中诗网", "诗礼传家","20201902"], ['https://www.yzs.com/zhgshg/index_11.html', "中诗网", "诗以言志","20201902"], ['https://www.yzs.com/zhgshg/index_12.html', "中诗网", "诗家三昧","20201902"], ] def start_requests(self): for url in self.start_urls: item = NewsdataItem() item["site"]=url[1] item["category"]=url[2] item["stu_id"]=url[3] yield scrapy.Request(url=url[0],meta={"item":item},callback=self.parse)

该文件为在spiders目录下创建的爬虫脚本文件,其中: start_requests:用于启动爬虫。该方法返回一个可迭代对象, scrapy.Request中url为请求的url,meta为用户自定义向回调函数传递的参数,可以实现数据在不同的解析函数中的传递(把当前页面抓取到的数据传递给下一个parse函数进行进一步处理),callback为回调函数,用于接受请求后的返回信息,yield把请求交给引擎。

def parse(self, response): item = response.meta["item"] site_ = item["site"] category_ = item["category"] stu_id_=item["stu_id"] title_list = response.xpath('//*[@class="blogs-list"]/ul/li/h2/a/text()').extract() print(title_list) text_url_list_tmp = response.xpath('//*[@class="blogs-list"]/ul/li/h2/a/@href').extract() text_url_list=[] for text_url_tmp in text_url_list_tmp: text_url_list.append("https://www.yzs.com"+text_url_tmp) for each in range(len(title_list)): item = NewsdataItem() item["site"] = site_ item["category"] = category_ item["stu_id"] = stu_id_ item["title"] = title_list[each] item["text_url"] = text_url_list[each] yield scrapy.Request(url=item["text_url"], meta={"item":item},callback=self.parse_detail)

parse:用于列表解析。每抓取一个url对应的网页信息就会调用该方法,解析并处理返回的response,返回item或requests,Item传给item pipeline持久化,requests交给Scrapy下载并由指定的回调函数处理(parse_detail),一直循环直到处理完所有数据。

def parse_detail(self,response): item = response.meta["item"] strs= response.xpath('//div[@class="newstext"]').extract_first() item["content"]=BeautifulSoup(strs,'lxml').text return item #把控制权给管道

detail_parse:用于内容解析。打开新的连接页面进行深度挖掘。由于content需要打开新的网页,所以在parse方法中没有对item[“content”]处理,而是在parse中的Request中指定在parse_detail中进行处理(打开新页面并解析抓取该新页面信息),最后return item把控制权给管道。

数据存储

通过pipelines.py中的代码,在pipelines.py文件中处理detail_parse通过引擎传来的数据,把数据存入配置好的MongoDB数据库。

运行scrapy框架

在NewsData文件的命令窗口中输入 scrapy crawl news

通过数据库可视化工具(Navicat)查看抓取并存入MongoDB数据库中的数据: 抓取的数据

基于Gerapy的爬虫框架项目部署 部署一个爬虫框架

(1)安装gerapy 在命令行输入 pip install gerapy (2)检验gerapy是否安装成功 在命令行输入 gerapy 在这里插入图片描述 上图所示为安装成功 (3)初始化一个gerapy项目 新建一个文件夹,在该文件夹中打开命令行,输入gerapy init 之后在该文件夹出现一个gerapy文件。 在这里插入图片描述

(4)数据迁移 进入该gerapy目录,打开命令行输入gerapy migrate 对数据库数据进行迁移。

在这里插入图片描述 在这里插入图片描述

数据迁移成功后在gerapy目录中出现dbs文件。 (5)创建超级用户 在命令行输入 gerapy initadmin 在这里插入图片描述

记住账户和初始密码 (6)启动服务 在命令行输入gerapy runserver 0.0.0.0:8000 在这里插入图片描述

服务端口号为8000,挂起该窗口不要关(否则服务停止)。 (7)创建主机 在浏览器中访问http://127.0.0.1.8000 在这里插入图片描述

出现上图界面,用户名和密码为(5)中的账户和初始密码。 输入用户名和密码后点击登录进入下图界面。 在这里插入图片描述

启动scrapyd服务(若未安装需在命令行输入pip install scrapyd进行安装),进入anoconda的Scripts目录中。

打开命令行输入 scrapyd。 在这里插入图片描述 在这里插入图片描述

服务端口号为6800,挂起该窗口不要关(否则服务停止) 进入主机管理页面后点击创建。 在这里插入图片描述

点击创建后出现下图界面,输入主机名称、IP,scrapyd的端口号,之后点击创建。

在这里插入图片描述

出现下图页面则创建成功。 在这里插入图片描述

(8)创建项目 将写好的爬虫文件放入projects文件中。 在这里插入图片描述 进入项目管理,项目创建成功后如下图,之后点击部署。 在这里插入图片描述 点击部署后进入如下页面,添加描述后,点击打包,部署。 在这里插入图片描述部署成功后如下图。 在这里插入图片描述 (9)创建任务 进入任务管理,点击创建。 在这里插入图片描述 点击创建后出现下图页面,名称为任务名称,项目为prejects文件下项目名称,爬虫为项目文件中爬虫文件名称,主机为创建的主机名称,调度方式根据需求设置,之后点击创建。 在这里插入图片描述 任务创建成功后出现下图页面,可点击状态查看任务执行情况。 在这里插入图片描述 下图为任务状态,任务运行成功。 在这里插入图片描述 在数据库可视化工具(Navicat)中查看抓取并存入MongoDB数据库中的数据。

在这里插入图片描述

部署多个爬虫框架

按照上述流程添加多个项目和任务。 在这里插入图片描述 在这里插入图片描述在主机管理的调度中查看任务运行情况。 在这里插入图片描述在这里插入图片描述在数据库可视化工具(Navicat)中出现抓取并存入MongoDB数据库中的数据表单。 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3