Hello各位,这是继上篇爬b站弹幕之后的第二篇应用。或许各位可能觉得爬弹幕不怎么正经,不过其实爬虫底层逻辑都是一样的,可以说是一招鲜,吃遍天,掌握基本逻辑基本就可以爬到所有的静态网页。昨天帮老板找了一些资料,ddl非常之急,然后自己写了一个爬虫。写着写着就会发现,写程序是为了加快工作效率,然而对于一个刚入门的人来说,写出来一大堆Bug不说,思考的过程和写的过程都非常累人,耗时极长。用pycharm这种实时调试功能并不是太好的IDE写就更不知道会怎么样了。最终很可能耗在编写的时间要远远大于自己手工找资料的时间。不过还好这次自己还是比较幸运的,不到两个小时爬到了712k的数据。先分享一下源码。
import requests
from bs4 import BeautifulSoup
import re
def getHTMLtext(url, code = 'utf-8'):
try:
r = requests.get(url, timeout = 100)
r.raise_for_status()
r.encoding = code
return r.text
except:
return ""
def parse_page(html):
content = getHTMLtext(html)
soup = BeautifulSoup(content, 'html.parser')
content = soup.find_all(name = 'div', attrs = {'class':'sub_con'})
soup1 = BeautifulSoup(str(content), 'html.parser')
string = soup1.find_all('p')
return string
def get_HTML(html):
content = getHTMLtext(html)
soup = BeautifulSoup(content, 'html.parser')
contents = soup.contents
pattern = re.compile(r'\d.\d.\d\.html')
lsts = re.findall(pattern, str(contents))
print(lsts)
lsts1 = []
for i in lsts:
page = r'http://www.boc.cn/aboutboc/bi1/' + i
lsts1.append(page)
return lsts1
def to_file(lst):
with open(r'C:/COD12/history/final.txt', 'a+', encoding = 'utf-8') as f:
for line in lst:
f.write(line)
start_url = 'http://www.boc.cn/aboutboc/bi1/index'
lst = [i+1 for i in list(range(20))]
list_of_pages = []
for i in lst:
url = start_url + '_' + str(i) + '.html'
list_of_pages.append(get_HTML(url))
print(list_of_pages)
for html in list_of_pages:
for number in html:
content = parse_page(number)
to_file(str(content))
和上次的爬虫对比一下就会发现改动会有但并不是很多,而且省去了传cookie的过程实际上简单很多,比较耗时的部分是正则表达式的规则。pattern = re.compile(r'\d.\d.\d\.html')表示6个数字,然后是2个任意字符,然后8个数字,一个任意字符,然后8个数字。
中行媒体页面的源码如下,实际上非常简单,每个新闻的标题旁边都跟了对应的url的一部分,这也使得正则表达式的应用变得舒服很多。get_HTML()函数干的活主要就是把当页所有新闻的url找出来,形成一个列表。
我让他在运行的时候print了一下,输出是这样的:
相当长的一段列表……因为我让他找了好十多页。
然后再定义一个parse_page()函数,用来在单个页面里找需要的正文信息。正文信息的标签属性并不独特,只是存在div标签下的一个p标签里,所以这里用了两次BeautifulSoup,一次定位到div,一次定位到这下面的p标签里。这里实际上是可以优化的……各位感兴趣可以自己写一下。
之后的事情就比较简单了,用for循环遍历列表逐一parse,然后将内容输出到文件里。
显然这个输出结果可以优化的部分非常非常多……但是用于搜索关键词定位文章位置而言完全是足够用的了。各位感兴趣的可以拿源码自己玩一玩,简化一下输出结果可以看得更清楚一些。能贴到评论区当然是最好的了。
领取专属 10元无门槛券
私享最新 技术干货