爬虫入门
前言
觉得爬虫挺有意思,在家自己捣鼓捣鼓,今天写了一个炒鸡菜的爬虫,与其说是爬虫,其实就是个迭代器。。。主要是熟悉一下BeautifulSoup
这个类。
正言
之前看到一个有意思的,说是在维基百科上,查找任意一个,一直循环点击第一个段落的第一个超链接,最后回到达哲学
那个栏中,觉得挺有意思,这次写的也是这样。就是通过不断搜寻第一个段落的第一个超链接放到link_chain
中,如果之后的超链接有和link_chain
重复的,那就停止访问了,不然一直死循环了,BeautifulSoup这个类主要处理扒下来的html
的,其实也还好理解。写了之后发现确实很多都循环了,但是其他的还真是很多就绕到了哲学那里,服气。。
直接贴py吧。
#coding=utf-8
import requests
import re
from bs4 import BeautifulSoup
import urllib
import time
start_url = 'https://en.wikipedia.org/wiki/2020_NASCAR_Cup_Series'
target_url = 'https://en.wikipedia.org/wiki/Philosophy'
def continue_crawl(search_history,target_url,max_steps=25):
if(search_history[-1] == target_url):
print("found target url! \n")
print(target_url)
return False
elif(len(search_history) > max_steps):
print("over length,done! \n")
return False
elif(search_history[-1] in search_history[:-1]):
print("already crawl it,done! \n")
return False
else:
return True
def find_first_link(url):
res = requests.get(url)
html = res.text
soup = BeautifulSoup(html,'html.parser')
content_div = soup.find(id='mw-content-text').find(class_='mw-parser-output')
first_link = None
for element in content_div.find_all('p',recursive=False):
if(element.find("a",recursive=False)):
first_link = element.find("a",recursive=False).get('href')
break
if not first_link:
return
first_link = urllib.parse.urljoin('https://en.wikipedia.org/',first_link)
return first_link
link_chain = [start_url]
while continue_crawl(link_chain,target_url):
print(link_chain[-1])
first_link = find_first_link(link_chain[-1])
if not first_link:
print("no link,done! \n")
break
link_chain.append(first_link)
time.sleep(2)
有一点要注意就是最好直接在英文版的wikipedia
,zh
开头的维基可能html标签不太对劲,所以直接用前者测试就好。
还发现如果循环了的话,就一般是在
Language
页面,而且基本上搜索啥迭代下去都会有Science
,别说还真挺神奇。。既然是找哲学,最后上一个找到哲学成功的吧23333。
也是随机选的,在wiki
的Current events
里挑的:
最后
有兴趣的小伙伴自己也可以试试, 我以后应该也会做一些高级的爬虫项目吧,慢慢来~