网站首页 > 文章中心 > 其它

python爬虫函数名_python爬虫接单网站

作者:小编 更新时间:2023-08-11 13:25:19 浏览量:353人看过

python爬虫 函数返回值如何调用?

在if 里只需要yield "" + item_url.attrs['href']

def getUrl(url: str):

....html = urlopen(url)

........if 'href' in item_url.attrs:

............yield "" + item_url.attrs['href']

....for href in getUrl(url):

python爬虫函数名_python爬虫接单网站-图1

........print(href)

if __name__ == '__main__':

如何用Python做爬虫

①.)首先你要明白爬虫怎样工作.

想象你是一只蜘蛛,现在你被放到了互联"网"上.那么,你需要把所有的网页都看一遍.怎么办呢?没问题呀,你就随便从某个地方开始,比如说人民日报的首页,这个叫initial pages,用$表示吧.

在人民日报的首页,你看到那个页面引向的各种链接.于是你很开心地从爬到了"国内新闻"那个页面.太好了,这样你就已经爬完了俩页面(首页和国内新闻)!暂且不用管爬下来的页面怎么处理的,你就想象你把这个页面完完整整抄成了个html放到了你身上.

突然你发现, 在国内新闻这个页面上,有一个链接链回"首页".作为一只聪明的蜘蛛,你肯定知道你不用爬回去的吧,因为你已经看过了啊.所以,你需要用你的脑子,存下你已经看过的页面地址.这样,每次看到一个可能需要爬的新链接,你就先查查你脑子里是不是已经去过这个页面地址.如果去过,那就别去了.

好的,理论上如果所有的页面可以从initial page达到的话,那么可以证明你一定可以爬完所有的网页.

python爬虫函数名_python爬虫接单网站-图2

那么在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都今天这一节,下面分析一下为什么爬虫事实上是个非常复杂的东西——搜索引擎公司通常有一整个团队来维护和开发.

如果你直接加工一下上面的代码直接运行的话,你需要一整年才能爬下整个豆瓣的内容.更别说Google这样的搜索引擎需要爬下全网的内容了.

问题出在哪呢?需要爬的网页实在太多太多了,而上面的代码太慢太慢了.设想全网有N个网站,那么分析一下判重的复杂度就是N*log(N),因为所有网页要遍历一次,而每次判重用set的话需要log(N)的复杂度.OK,OK,我知道python的set实现是hash——不过这样还是太慢了,至少内存使用效率不高.

注意到这个特点,url如果被看过,那么可能以小概率重复看一看(没关系,多看看不会累死).但是如果没被看过,一定会被看一下(这个很重要,不然我们就要漏掉一些网页了!). [IMPORTANT: 此段有问题,请暂时略过]

爬取豆瓣的时候,我总共用了100多台机器昼夜不停地运行了一个月.想象如果只用一台机子你就得运行100个月了...

那么,假设你现在有100台机器可以用,怎么用python实现一个分布式的爬取算法呢?

考虑如何用python实现:

在各台slave上装好scrapy,那么各台机子就变成了一台有抓取能力的slave,在master上装好Redis和rq用作分布式队列.

代码于是写成

#slave.py

current_url = request_from_master()

python爬虫函数名_python爬虫接单网站-图3

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())

elif request == 'POST':

bf.put(request.url)

好的,其实你能想到,有人已经给你写好了你需要的:darkrho/scrapy-redis - GitHub

虽然上面用很多"简单",但是真正要实现一个商业规模可用的爬虫并不是一件容易的事.上面的代码用来爬一个整体的网站几乎没有太大的问题.

但是如果附加上你需要这些后续处理,比如

有效地存储(数据库应该怎样安排)

有效地判重(这里指网页判重,咱可不想把人民日报和抄袭它的大民日报都爬一遍)

有效地信息抽取(比如怎么样抽取出网页上所有的地址抽取出来,"朝阳区奋进路中华道"),搜索引擎通常不需要存储所有的信息,比如图片我存来干嘛...

及时更新(预测这个网页多久会更新一次)

如你所想,这里每一个点都可以供很多研究者十数年的研究.虽然如此,

"路漫漫其修远兮,吾将上下而求索".

所以,不要问怎么入门,直接上路就好了:)

python爬虫,这个表示什么意思?

savepath是变量,表示存储地址.

saveData是一个函数,用来把数据存储在savepath这个地址.

以上就是土嘎嘎小编为大家整理的python爬虫函数名相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章