python爬虫封装函数 python函数封装总结

python自动化爬虫封装成exe文件别的软件可以运行吗不可以 。根据查询相关公开信息显示python爬虫封装函数,python自动化爬虫封装成exe文件python爬虫封装函数,系统运行阻挡模式python爬虫封装函数,别的软件不可以运行 。Python由荷兰数学和计算机科学研究学会的吉多范罗苏姆于1990年代初设计python爬虫封装函数,作为一门叫做ABC语言的替代品 。
python 爬虫(学了3天写出的代码) import requests import parsel import threading,os import queue
class Thread(threading.Thread): definit (self,queue,path): threading.Thread. init (self) self.queue = queue self.path = path
def download_novel(url, path): res = get_response(url) selctor = parsel.Selector(res) title = selctor.css('.booknameh1::text').get() print(title) content = ' '.join(selctor.css('#content::text').getall()) # 使用join方法改变内容; with open( pathtitle".txt","w",encoding='utf-8') as f: f.write(content) print(title,'保存成功!') f.close()
def get_response(url): # 获得网站源码; response = requests.get(url) response.encoding = 'utf-8' return response.text
ifname== ' main ': # 函数入口 url = str(input('请输入你要下载小说的url:')) response = get_response(url) sel = parsel.Selector(response) novelname = sel.css('#infoh1::text').get() urllist = sel.css('.box_con p dl dd a::attr(href)').getall() queue = queue.Queue() path = './{}/'.format(novelname)
python爬虫是干嘛的爬虫技术是一种自动化程序 。
爬虫就是一种可以从网页上抓取数据信息并保存python爬虫封装函数的自动化程序python爬虫封装函数,它python爬虫封装函数的原理就是模拟浏览器发送网络请求 , 接受请求响应,然后按照一定的规则自动抓取互联网数据 。
搜索引擎通过这些爬虫从一个网站爬到另一个网站,跟踪网页中的链接 , 访问更多的网页,这个过程称为爬行,这些新的网址会被存入数据库等待搜索 。简而言之,爬虫就是通过不间断地访问互联网 , 然后从中获取你指定的信息并返回给你 。而我们的互联网上 , 随时都有无数的爬虫在爬取数据 , 并返回给使用者 。
爬虫技术的功能
1、获取网页
获取网页可以简单理解为向网页的服务器发送网络请求,然后服务器返回给我们网页的源代码,其中通信的底层原理较为复杂,而Python给我们封装好了urllib库和requests库等,这些库可以让我们非常简单的发送各种形式的请求 。
2、提取信息
获取到的网页源码内包含了很多信息,想要进提取到我们需要的信息,则需要对源码还要做进一步筛选 。可以选用python中的re库即通过正则匹配的形式去提取信息,也可以采用BeautifulSoup库(bs4)等解析源代码 , 除了有自动编码的优势之外,bs4库还可以结构化输出源代码信息 , 更易于理解与使用 。
3、保存数据
提取到我们需要的有用信息后,需要在Python中把它们保存下来 。可以使用通过内置函数open保存为文本数据,也可以用第三方库保存为其它形式的数据,例如可以通过pandas库保存为常见的xlsx数据,如果有图片等非结构化数据还可以通过pymongo库保存至非结构化数据库中 。
如何用Python做爬虫1)首先你要明白爬虫怎样工作 。
想象你是一只蜘蛛 , 现在你被放到了互联“网”上 。那么 , 你需要把所有的网页都看一遍 。怎么办呢?没问题呀,你就随便从某个地方开始 , 比如说人民日报的首页,这个叫initial pages,用$表示吧 。
在人民日报的首页,你看到那个页面引向的各种链接 。于是你很开心地从爬到了“国内新闻”那个页面 。太好了,这样你就已经爬完了俩页面(首页和国内新闻)!暂且不用管爬下来的页面怎么处理的,你就想象你把这个页面完完整整抄成了个html放到了你身上 。
突然你发现, 在国内新闻这个页面上,有一个链接链回“首页” 。作为一只聪明的蜘蛛,你肯定知道你不用爬回去的吧,因为你已经看过了啊 。所以,你需要用你的脑子,存下你已经看过的页面地址 。这样,每次看到一个可能需要爬的新链接,你就先查查你脑子里是不是已经去过这个页面地址 。如果去过,那就别去了 。
好的,理论上如果所有的页面可以从initial page达到的话,那么可以证明你一定可以爬完所有的网页 。
那么在python里怎么实现呢?
很简单
import Queue
initial_page = "初始化页"
url_queue = Queue.Queue()
seen = set()
seen.insert(initial_page)
url_queue.put(initial_page)
while(True): #一直进行直到海枯石烂
if url_queue.size()0:
current_url = url_queue.get()#拿出队例中第一个的url
store(current_url)#把这个url代表的网页存储好
for next_url in extract_urls(current_url): #提取把这个url里链向的url
if next_url not in seen:
seen.put(next_url)
url_queue.put(next_url)
else:
break
写得已经很伪代码了 。
所有的爬虫的backbone都在这里,下面分析一下为什么爬虫事实上是个非常复杂的东西——搜索引擎公司通常有一整个团队来维护和开发 。
2)效率
如果你直接加工一下上面的代码直接运行的话,你需要一整年才能爬下整个豆瓣的内容 。更别说Google这样的搜索引擎需要爬下全网的内容了 。
问题出在哪呢?需要爬的网页实在太多太多了,而上面的代码太慢太慢了 。设想全网有N个网站,那么分析一下判重的复杂度就是N*log(N),因为所有网页要遍历一次,而每次判重用set的话需要log(N)的复杂度 。OK,OK , 我知道python的set实现是hash——不过这样还是太慢了 , 至少内存使用效率不高 。
通常的判重做法是怎样呢?Bloom Filter. 简单讲它仍然是一种hash的方法,但是它的特点是 , 它可以使用固定的内存(不随url的数量而增长)以O(1)的效率判定url是否已经在set中 。可惜天下没有白吃的午餐 , 它的唯一问题在于 , 如果这个url不在set中,BF可以100%确定这个url没有看过 。但是如果这个url在set中,它会告诉你:这个url应该已经出现过,不过我有2%的不确定性 。注意这里的不确定性在你分配的内存足够大的时候,可以变得很小很少 。一个简单的教程:Bloom Filters by Example
注意到这个特点,url如果被看过,那么可能以小概率重复看一看(没关系,多看看不会累死) 。但是如果没被看过,一定会被看一下(这个很重要 , 不然我们就要漏掉一些网页了?。?。[IMPORTANT: 此段有问题 , 请暂时略过]
好,现在已经接近处理判重最快的方法了 。另外一个瓶颈——你只有一台机器 。不管你的带宽有多大,只要你的机器下载网页的速度是瓶颈的话,那么你只有加快这个速度 。用一台机子不够的话——用很多台吧!当然,我们假设每台机子都已经进了最大的效率——使用多线程(python的话,多进程吧) 。
3)集群化抓取
爬取豆瓣的时候,我总共用了100多台机器昼夜不停地运行了一个月 。想象如果只用一台机子你就得运行100个月了...
那么,假设你现在有100台机器可以用 , 怎么用python实现一个分布式的爬取算法呢?
我们把这100台中的99台运算能力较小的机器叫作slave,另外一台较大的机器叫作master , 那么回顾上面代码中的url_queue,如果我们能把这个queue放到这台master机器上,所有的slave都可以通过网络跟master联通,每当一个slave完成下载一个网页,就向master请求一个新的网页来抓取 。而每次slave新抓到一个网页,就把这个网页上所有的链接送到master的queue里去 。同样 , bloom filter也放到master上,但是现在master只发送确定没有被访问过的url给slave 。Bloom Filter放到master的内存里,而被访问过的url放到运行在master上的Redis里,这样保证所有操作都是O(1) 。(至少平摊是O(1),Redis的访问效率见:LINSERT – Redis)
考虑如何用python实现:
在各台slave上装好scrapy,那么各台机子就变成了一台有抓取能力的slave,在master上装好Redis和rq用作分布式队列 。
代码于是写成
#slave.py
current_url = request_from_master()
to_send = []
for next_url in extract_urls(current_url):
to_send.append(next_url)
store(current_url);
send_to_master(to_send)
#master.py
distributed_queue = DistributedQueue()
bf = BloomFilter()
initial_pages = ""
while(True):
if request == 'GET':
if distributed_queue.size()0:
send(distributed_queue.get())
else:
break
elif request == 'POST':
bf.put(request.url)
好的,其实你能想到 , 有人已经给你写好了你需要的:darkrho/scrapy-redis · GitHub
4)展望及后处理
虽然上面用很多“简单”,但是真正要实现一个商业规模可用的爬虫并不是一件容易的事 。上面的代码用来爬一个整体的网站几乎没有太大的问题 。
但是如果附加上你需要这些后续处理,比如
有效地存储(数据库应该怎样安排)
有效地判重(这里指网页判重,咱可不想把人民日报和抄袭它的大民日报都爬一遍)
有效地信息抽?。ū热缭趺囱槿〕鐾成纤械牡刂烦槿〕隼?nbsp;, “朝阳区奋进路中华道”),搜索引擎通常不需要存储所有的信息,比如图片我存来干嘛...
及时更新(预测这个网页多久会更新一次)
如你所想,这里每一个点都可以供很多研究者十数年的研究 。虽然如此,
“路漫漫其修远兮,吾将上下而求索” 。
所以,不要问怎么入门,直接上路就好了:)
Python编程基础之(五)Scrapy爬虫框架 经过前面四章的学习 , 我们已经可以使用Requests库、Beautiful Soup库和Re库,编写基本的Python爬虫程序了 。那么这一章就来学习一个专业的网络爬虫框架--Scrapy 。没错,是框架,而不是像前面介绍的函数功能库 。
Scrapy是一个快速、功能强大的网络爬虫框架 。
可能大家还不太了解什么是框架,爬虫框架其实是实现爬虫功能的一个软件结构和功能组件的集合 。
简而言之,Scrapy就是一个爬虫程序的半成品 , 可以帮助用户实现专业的网络爬虫 。
使用Scrapy框架,不需要你编写大量的代码,Scrapy已经把大部分工作都做好了,允许你调用几句代码便自动生成爬虫程序,可以节省大量的时间 。
当然 , 框架所生成的代码基本是一致的,如果遇到一些特定的爬虫任务时,就不如自己使用Requests库搭建来的方便了 。
PyCharm安装
测试安装:
出现框架版本说明安装成功 。
掌握Scrapy爬虫框架的结构是使用好Scrapy的重中之重!
先上图:
整个结构可以简单地概括为: “5 2”结构和3条数据流
5个主要模块(及功能):
(1)控制所有模块之间的数据流 。
(2)可以根据条件触发事件 。
(1)根据请求下载网页 。
(1)对所有爬取请求进行调度管理 。
(1)解析DOWNLOADER返回的响应--response 。
(2)产生爬取项--scraped item 。
(3)产生额外的爬取请求--request 。
(1)以流水线方式处理SPIDER产生的爬取项 。
(2)由一组操作顺序组成,类似流水线,每个操作是一个ITEM PIPELINES类型 。
(3)清理、检查和查重爬取项中的HTML数据并将数据存储到数据库中 。
2个中间键:
(1)对Engine、Scheduler、Downloader之间进行用户可配置的控制 。
(2)修改、丢弃、新增请求或响应 。
(1)对请求和爬取项进行再处理 。
(2)修改、丢弃、新增请求或爬取项 。
3条数据流:
(1):图中数字 1-2
1:Engine从Spider处获得爬取请求--request 。
2:Engine将爬取请求转发给Scheduler,用于调度 。
(2):图中数字 3-4-5-6
3:Engine从Scheduler处获得下一个要爬取的请求 。
4:Engine将爬取请求通过中间件发送给Downloader 。
5:爬取网页后,Downloader形成响应--response,通过中间件发送给Engine 。
6:Engine将收到的响应通过中间件发送给Spider处理 。
(3):图中数字 7-8-9
7:Spider处理响应后产生爬取项--scraped item 。
8:Engine将爬取项发送给Item Pipelines 。
9:Engine将爬取请求发送给Scheduler 。
任务处理流程:从Spider的初始爬取请求开始爬取,Engine控制各模块数据流 , 不间断从Scheduler处获得爬取请求,直至请求为空,最后到Item Pipelines存储数据结束 。
作为用户 , 只需配置好Scrapy框架的Spider和Item Pipelines,也就是数据流的入口与出口,便可完成一个爬虫程序的搭建 。Scrapy提供了简单的爬虫命令语句,帮助用户一键配置剩余文件,那我们便来看看有哪些好用的命令吧 。
Scrapy采用命令行创建和运行爬虫
PyCharm打开Terminal,启动Scrapy:
Scrapy基本命令行格式:
具体常用命令如下:
下面用一个例子来学习一下命令的使用:
1.建立一个Scrapy爬虫工程,在已启动的Scrapy中继续输入:
执行该命令,系统会在PyCharm的工程文件中自动创建一个工程 , 命名为pythonDemo 。
2.产生一个Scrapy爬虫,以教育部网站为例:
命令生成了一个名为demo的spider,并在Spiders目录下生成文件demo.py 。
命令仅用于生成demo.py文件,该文件也可以手动生成 。
观察一下demo.py文件:
3.配置产生的spider爬虫 , 也就是demo.py文件:
4.运行爬虫,爬取网页:
如果爬取成功 , 会发现在pythonDemo下多了一个t20210816_551472.html的文件,我们所爬取的网页内容都已经写入该文件了 。
以上就是Scrapy框架的简单使用了 。
Request对象表示一个HTTP请求,由Spider生成 , 由Downloader执行 。
Response对象表示一个HTTP响应,由Downloader生成,有Spider处理 。
Item对象表示一个从HTML页面中提取的信息内容 , 由Spider生成,由Item Pipelines处理 。Item类似于字典类型,可以按照字典类型来操作 。
Python网络爬虫学习建议,初学者需要哪些准备了解html和简单的js,只有了解你要抓取的页面 , 在获取后才能有效分析 。建议系统学习html这个很简单;js较复杂不必多看,可以边分析边百度资料学习 。
python方面 , 了解urllib和urllib2两个库,在抓取页面要用到 。Cookielib这个库配合urllib2可以封装opener,在需要cookie时可以自动解决 , 建议了解一些,会封装opener即可 。re正则表达式库可以帮助你高效的从页面中分离要的内容 , 正则表达式要略知一二 。
学习一些抓包知识,有些网站防爬,需要人工浏览一些页面 , 抓取数据包分析防爬机制,然后做出应对措施 。比如解决cookie问题,或者模拟设备等 。
作为初学者,学会以上知识基本上爬取任何网站都没问题了,但更重要的是耐心和细心 。毕竟爬取网站时并不知道网站已开始是怎么设计的 , 有哪些小坑,分析起来这些还是比较烧脑,但是分析成功很有成就感 。
【python爬虫封装函数 python函数封装总结】关于python爬虫封装函数和python函数封装总结的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读