简介:今天,首席执行官指出,要与您分享Python需要爬网的数据。如果您可以解决您现在面临的问题,请不要忘记注意此网站。让我们现在开始!
方法/步骤
在攀登数据之前,您需要下载并安装两件事,一件是Urllib,另一个是Python-Docx。
请单击输入图片说明
然后在Python的编辑中输入导入选项以提供这两个库的服务
请单击输入图片说明
Urllib主要负责网页的数据。实际上,只需抓住网页数据就非常简单。输入图中所示的命令,并有一个链接。
请单击输入图片说明
捕获它,不计算,您必须阅读它,否则它将无效。
请单击输入图片说明
5
下一步是获取代码。如果您不转移它,那么您也不会完成它。读取函数读取。标记一个,例如xa。
请单击输入图片说明
6
最后,输入三个句子。第一个句子意味着创建一个新的空白文档文档。
第二个句子意味着将文本段落添加到文档中,以及变量XA的东西抓住它。
第三个句子意味着保存文档docx,名称在括号中。
请单击输入图片说明
7
这是爬下来的源代码。如果您仍然需要筛选,则需要自己添加各种正则表达式。
当用Python爬行许多网页以获取所需的数据时,最重要的问题是爬网中断的问题。Python的脚本语言,一种中断
该过程将退出,以及如何在中断之后继续进行最后的爬行任务。在这里,我们专注于分析这个中断问题。
第一个问题:可以解决简单的动态代理池。当爬行大量数据时,为了速度,建议使用一些缓慢的
沉积的中间件将有效连接IP并定期更新。我在此处推荐此仓库
,它将进行IP有效性验证并将IP放入Redis,但太复杂了
我还使用了DB,我个人认为最好自己修改它。困难是它将使用其他请求来判断当前的IP是否存在
这是一个爬行者。当我们专注于爬行者的请求并忽略其他请求时,我们可能会被服务器判断为爬网,然后将其判断为此IP
它将包含在黑名单中,您会像更改IP一样被卡在这里
去攀登,但是速度太慢了。让我们自己分析它,而且不会太复杂。
第二个问题:网络连接超时是一个高概率问题。爬行时本地网络可能会波动,或者可能正在爬行
服务器已限制IP。攀登一定级别时,请执行一些延迟操作,以便一些通用的HTTP库加班
(urllib)。但是,如果服务器的手动通常不太高,我们只需要手动设置一个更高的
超时可以(30秒)。最好在爬行开始时使用我们需要使用的攀登库。
移动。
第三个问题:分析大量静态页面时,某些静态页面的某些分析规则是不同的,因此我们必须做得很好
推荐的准备工作(PS:如果简单忽略错误可能会导致大量数据丢失,这是不明智的)。
有一个解决方案的解决方案的解决方案,即生产者和消费者的分离。生产商将生产爬行者来攀登URL。消费者正在爬行
最终数据爬行动物。最终分析数据是消费者爬网。它们是通过消息中间件连接的,生产者将其发送到消息中间件。
爬行的目标信息,消费者可以从内部获取,并间接实施分布式爬行功能。
ACK机制,一种消费者爬网的链接故障将导致新闻消费失败,这将分配给其他消费者。因此,信息丢失了
概率非常低。但是,这里还有一个提示。消费者的消费时间不长,这将导致消息及时发布。
中价数据的数据耐用,否则消息过多,消耗不会及时破坏机器内存。
第四个问题:这种情况只能尝试,除了捕获外,解决并不容易解决。如果单独分析,将需要一些时间。
大多数数据(99%)是正常的,只是放弃了这种异常放弃。实际上,有解决第三个问题的解决方案。
有时中断问题更加方便。
希望帮助您。
一个借口数万个数据,但只有十片Data_n 10,000爬行动物练习的食谱数据
2020-12-03 06:37:24
Weixin_39990029
代码年龄5岁
专注于
BE22F93FC7BBC7CBDD62166579A1FD22.PNG
XX线代码爬行10,000种食谱数据用于爬行动物练习
什么是爬行者
Care:也称为网络蜘蛛,它是一个程序,可以自动捕获Internet信息以获取对我们从Internet有价值的信息。
单击此处了解有关Python爬行动物简介
如何合法爬行
不允许一些网站限制攀登的内容,或者可以通过访问网站上的robots.txt文件获得网站上的爬行动物协议。
以Douban.com为例
访问此URL(),您可以了解到Dielan的爬行动物协议如下
1FE03008A45085DC6DA4978543E75C.PNG
可以看出,Douban对不同访客有不同的访问限制。其中,Douban不允许访问Wandoujia Spider的用户名。
我使用的食谱网站是无限的爬网,因此爬网是合法的。
E4025D9F5D8B96388EFA942E02555D1F9.PNG
特征
不断10,000个网页
介绍第三方库
导入请求#send请求
导入RE #Re #Remular表达式,用于提取网页数据
导入获胜#Reminder程序运行结束
导入时间#calculing程序运行时间
如果未安装这些第三方库,则可以在命令提示符下输入以下代码以下载
PIP安装请求,RE,WINSOUND,时间
爬行者的三个步骤
获取所有网页的网站爬网
在Web内容中提取有用的信息
信息导出
每个步骤都对应一个函数
步骤_1获取所有网页的网站要爬行
首先,我们打开URL并检查其源代码
00EB8B89C9BF17460BCA4D47F017BAB.PNG
365621D25C80F9283485350C083A545.PNG
Web源代码
观察发现与每道菜相对应的网站在此目录中
9D729B843DF3A746D70EA7AF31A1D962.PNG
获取带有正则表达式的URL,在列表中写入
由于每个网页只有十种菜肴,因此单击下一页
D342D8422E16C48C9600A45A6D1C9.PNG
您最多可以看到1000页,这意味着10,000盘
fb279b42fcdd3cecf7cda79ba4a8ae53.png
使用周期将与菜肴的每一页相对应的网络写入列表。每次写作时,都会写一行列表。多次之后,您形成了两个维度列表。中间显示如下:
31E3755DC8B45EC6F4DAC3C3C05F261539.PNG
代码显示如下
all_url = []#创建一个存储网页地址的数组
def get_all_url(n):#这个功能用于获取网页上的所有菜肴网站
如果(n == 1):
url =“”
别的:
url =''%n#%s等于c语言中的%s,这意味着格式化对象为字符,而%d代表将对象格式化为整数
标题= {“用户代理”:“ Mozilla/5.0(Windows NT 10.0; Win64; X64)
AppleWebkit/537.36(Khtml,像Gecko)Chrome/80.0.3987.122 Safari/537.36“}”}
响应= requests.get(url,标题=标题)#网
wendmes.encoding =“ utf-8”#设置接收编码格式
模式= re.compile(r'a target =“ _ blank” href =“ https://www.shouxicto.com/article/article//za-z--z>://.re.s)
#xtract网页中的URL,re.s表示整个文本是匹配的。如果您不添加RE.S,它将仅在一行中匹配
结果=模式.findall(wendys.text)获得的网页结果存储在结果中
all_url.append(结果[0:10])#由于每个页面只有十道菜,只有前十种与菜肴的网站相对应,因此我们只添加前十个。
返回all_url#as返回值返回此列表
标题的说明
当使用Python爬网爬网数据时,通常会在网站上遇到一些反爬行者,通常是针对标题中的用户代理。如果标题上没有设置,则用户代理会声明他是一个python脚本,Andif网站具有反crawler的想法,它将不可避免地拒绝此连接。修改标头可以将您的reptile插入到正常的访问中要浏览器以避免此问题。在这里单击以了解详细信息
编码格式UTF-8的说明
UTF-8可以编码中文,大多数Python编译器是UTF-8的默认编码方法,请单击此处以了解详细信息
步骤_2在网页中提取有用的信息
打开菜的网站,检查源代码,查找我们需要的信息,然后使用正则表达式获得。该过程与以前的函数相同,获得了URL
主要补充信息在这里
C0DDFD3110775BB8B71759F6927F26D4.PNG
这里的功能信息(包括练习和口味)
38C99C1A51137DEBCAFE38AE3122E19A.PNG
def get_info(resp,输出):
name_pattern = re.com(r'h1(。*)/h1')#正则表达式获取菜肴名称信息
food_pattern = re.compile(r的class =“ t”(。*)/spanspan class =“ a”(。*)/span/div')#正则表达式
fixing_pattern = re.com(r'div class =“ c_mtr_li” span class =“ t1”(。*)/spanspan class =“ a”(。
fearture1_pattern = re.com(r'div class =“ cpargs cpargs2” div class =“ i”/div(。)/div')##
fearture2_pattern = re.com(r'div class =“ cpargs cpargs3” div class =“ i”/div(。*)/div')#正则表达式
name = name_pattern.findall(resp.text)#提取菜肴名称信息
food = food_pattern.findall(resp.text)#提取主要成分信息
fixing = fixing_pattern.findall(resp.text)#stract无访问信息
fearture1 = fearture1_pattern.findall(resp.text)#tract feature_1
fearture2 = fearture2_pattern.findall(resp.text)#tract feature_2
output.write(str(name))#o o o o o o o o o o o o o o o o o o o o o。写功能不能写入int类型参数,因此请使用str()进行转换
output.write('t')#进入下一个单元格
output.write(str(fearture1))#将功能_1放在输出文件
output.write('t')#进入下一个单元格
output.write(str(fearture2))#put feature_2写入输出文件
output.write('t')#进入下一个单元格
对于我的范围(len(食物)):
对于J范围(len(食物[i]):)::):
output.write(str(food [i] [j])#
output.write('t')
如果(Len(食物)11):
output.write('t'*2*(11-len(food))#)#每道菜的主要成分不同,代码可以对齐表内容
对于我的范围(len(fixing)):
对于J范围(len(fix fix [i]):)::):
output.write(str(修复[i] [j])#
output.write('t')
output.write('n')#
步骤_3信息导出
Def Spider():
output = open('e:programingpython sucai_2.xls','w',encoding ='utf-8')#创建一个excel文件,编码格式为utf-8
output.write('名称t方法t特别t o')#写入标题栏
output.write('t'*22)#对齐内容
output.write
对于我的范围(len(all_url)):
对于J中的J(len(all_url [i])):
url2 = all_url [i] [j]
响应= requests.get(url2)#逐个访问网页以获取数据
wendmes.encoding =“ utf-8”#设置接收编码格式
get_info(响应,输出)#处理数据,提取信息
output.close()#close文件
主功能
time_start = time.time(time()#record程序开始时间
对于我的范围(1,2):#f f f f f f f f f f f f f
get_all_url(i)
Spider()#for提取和导出
持续时间= 1000#及时声音持续时间,1000毫秒= 1秒
freq = 440 #prompt音频
time_end = time.time(Time()#record程序结束时间
打印('完全成本',time_end time_start)#print程序运行时间
winsound.beep(freq,持续时间*10)#w w提示程序结束
实验后,爬网大约需要3453秒
E8B6C8637980D2AEF9587711C7084A5F.png
最后一个数据如下
97A8662CF048844850658AEF841E04C3.PNG
写在后面
我是C语言的80岁的小白色。我依靠一定程度和一首歌来争取该节目。在代码风格和写作方面,有不可避免的地方。与我交流并批评我很多。
1.爬上我们需要的前线链接
channel_extract.py
前线链接这里是我们所说的大类别链接:
从BS4导入美丽的群岛请求
start_url =''host_url =''def get_channels(url):
wb_data = requests.get(url)
汤= beautifutsoup(wb_data.text,'lxml')
links = soup.select('。feenlei dt a')#print(链接)
对于链接中的链接:
pay_url = host_url + link.get('href')
print(page_url)#get_channel_urls(start_url)channel_urls =''''
''''12345678911111313141516171819202222227272727272727272727272727272729333333333666666
然后以我爬行的58个城市为例,以抓住第二类市场的所有类别的链接,这是我说的大型类别链接。
找到这些链接的共同特征,使用功能输出它,然后将其存储为多行文本。
2.获取我们需要的页面所需的详细信息的链接和详细信息
page_parsing.py
1.谈论我们的数据库:
首先查看代码:
#件来自bs4 intimport offiment requestsimport pymongo #python操作mongodb的库导入重新竞争时间#并建立数据库客户端= pymongoclient('localhost',277,27
ceshi = client ['ceshi'] #c ceshi数据库ganji_url_list = ceshi ['ganji_url_list'] #create a表文件ganji_url_info = ceshi_url_url_info']
2.确定页面结构是否与我们想要的页面结构匹配,例如有时404页;
3.从页面上提取我们想要的链接,即每个详细信息页面的链接;
我们想在这里说的是:
item_link = link.get('href')。拆分('?')[0] 12
这里是什么类型的链接,这是什么获取方法?
后来我发现这种类型是
'bs4.element.tab1类
如果我们想单独获得某个属性,则可以使用它,例如,我们获得了什么类名称
打印汤。P['class']
#['title'] 12
也可以使用GET方法传递属性的名称,两者是等效的
打印汤。get('class')#['title'] 12
让我发布代码:
#所有产品页面链接的疯狂详细信息:def get_type_links(频道,num):
list_view ='{0} o {1}/'。格式(频道,str(num))#print(list_view)
wb_data = requests.get(list_view)
汤= beautifutsoup(wb_data.text,'lxml')
linkon = soup.select('。pagebox')#determine是否是我们所需页面的标志;
#如果选择攀爬的选择链接为:div.pagebox ul li:nth-child(1)跨度:nth-child(1)删除它
#print(linkon)
如果Linkon:
link = soup.select('。zz.zz-til a')
link_2 = soup.select('。js-item a')
链接=链接 +链接_2 #print(len(link))
对于链接中的链接:
linkc = linkc.get('href')
ganji_url_list.insrt_one({'url':linkc})
print(linkc)else:Pass12345678911111313151617181920
4.我们在详细信息页面中需要的信息
让我发布一件代码:
#Crazy Jiji详细信息页面链接:def get_url_info_ganji(url):
时间。
wb_data = requests.get(url)
汤= beautifutsoup(wb_data.text,'lxml')尝试:
title = soup.select('头标题')[0] .TEXT
timec = sound.select('。pr-5')[0] .text.strip()
type = soup.selet('。dest-infor li span a'')[0] .TEXT
价格=汤。选择('。det-infor li i')[0] .Text
place = soup.select('。det-infor li a')[1:]
placec = []适当的位置:
placeb.append(placec.text)
tag = soup.select('。二-dt-bewrite ul li')[0] .TEXT
tag =''.join(tag.split())#print(time.split())
data = {'url':url,'title':title,'time':timec.split(),'type':type':type,'price':price':price,'plote':placeb,'place':placeb,'new':tag':标签':tag':tag':tag':tag':标签
}
ganji_url_info.insert_one(数据)#insert数据库中的一块数据;
印刷(数据)除indexError:pass1234567891111113131417181920222222222227282930
4.如何编写我们的主要功能?
main.py
查看代码:
对于我的范围(1,100):
get_type_links(channel,i)#执行此功能后爬网所有详细信息页面的所有详细信息:如果__name __ =='__ main __':#pool = pool = pool = pool()## pool()#pool.map(get_url_info_info_ganji)[[[[get_url_info_ganji,[[[[[[url [url'url'] for url in ganji_url_list.find()]#pool.close()#pool.join()#pirst clirst执行以下函数来抓取所有链接。':
pool = pool()
pool = pool()
pool.map(get_all_links_from,channel_urls.split())
pool.close()
pool.join()12345678911111131314151618192022222242666
五,计数程序
count.py
用于显示爬行数据的数量;
导入到page_parsing导入import ganji_url_list,ganji_url_infowhile true:#print(ganji_url_list.find()。count()))
#time.sleep(5)
打印(ganji_url_info.find()。count())
时间。
结论:以上是首席执行官的全部内容指出,Python需要爬行。感谢您阅读本网站的内容。我希望这对您有帮助。有关Python需要爬网的数据的更多信息,不要忘记在此站点上找到它。