严正声明:爬虫仅用于学习研究,不做商业或者其它非法用途!
首先我们要爬取的网页地址为:https://bbs.hupu.com/bxj
页面的样子是这样的:
红色圈出来的部分就是我们所要爬取的内容信息。
接下来最重要的自然是页面元素的分析,这个就不多说了,这是爬虫代码编写的前提,也是最最基本、最最重要的部分。
简单的来说就是 右键想要爬取的内容,选择“检查”。需要大家了解一点html简单的入门知识就好了。
好了,话不多说,先上第一版代码,没有连接数据库,只是输出,这样也是为了保证数据在存入数据库之前是准确的。
#_*_ coding=UTF-8 _*_
import requests
from bs4 import BeautifulSoup
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36'}
link='https://bbs.hupu.com/bxj'
re=requests.get(link,headers=headers)
soup=BeautifulSoup(re.content,'lxml')
soup_list=soup.find('ul',class_='for-list')
li_list=soup_list.find_all('li')
for lli in li_list:
title=lli.find('div',class_='titlelink box')
print('标 题:'+title.a.string)#重点:NavigableString对象获取文本内容的方法
print('标题链接:'+"https://bbs.hupu.com"+title.a['href'])#重点:获取标签内链接的方法
author=lli.find('div',class_='author box')
print('作 者:'+author.a.string)
print('发布时间:'+author.contents[5].string)
reply_view=lli.find('span',class_='ansour box')
reply_view=reply_view.text.strip().split('/')#重点:对形如23/34这样的字符串进行分割
print('回 复:'+reply_view[0].strip())#strip()不可省略,否则会有空格
print('浏 览:'+reply_view[1].strip())
endreply=lli.find('div',class_='endreply box')
print('最后回复时间:'+endreply.a.string)
print('最后回复链接:'+"https://bbs.hupu.com/"+endreply.a['href'])
print('最后回复人 :'+endreply.span.string)
print()
接下来就是连接MongoDB数据库,它有一个好处就是我们不需要提前建立数据库以及表,当我们需要使用的数据库不存在时,它会主动建立,但是这里也要注意避免已有数据库的冲突。所以一般情况下,在数据插入之前最好先做检查。
上代码:
#_*_ coding=UTF-8 _*_
import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
client=MongoClient('localhost',27017)#建立客户端对象
hupu=client.hupu#链接数据库hupu,没有则自动建立
post=hupu.post#使用post集合,没有则自动建立
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36'}
link='https://bbs.hupu.com/bxj'
re=requests.get(link,headers=headers)
soup=BeautifulSoup(re.content,'lxml')
soup_list=soup.find('ul',class_='for-list')
li_list=soup_list.find_all('li')
for lli in li_list:
title=lli.find('div',class_='titlelink box')
print('标 题:'+title.a.string)#重点:NavigableString对象获取文本内容的方法
print('标题链接:'+"https://bbs.hupu.com"+title.a['href'])#重点:获取标签内链接的方法
author=lli.find('div',class_='author box')
print('作 者:'+author.a.string)
print('发布时间:'+author.contents[5].string)
reply_view=lli.find('span',class_='ansour box')
reply_view=reply_view.text.strip().split('/')#重点:对形如23/34这样的字符串进行分割
print('回 复:'+reply_view[0].strip())#strip()不可省略,否则会有空格
print('浏 览:'+reply_view[1].strip())
endreply=lli.find('div',class_='endreply box')
print('最后回复时间:'+endreply.a.string)
print('最后回复链接:'+"https://bbs.hupu.com/"+endreply.a['href'])
print('最后回复人 :'+endreply.span.string)
print()
post.insert_one({'标题':title.a.string,'标题链接':"https://bbs.hupu.com"+title.a['href'],'作 者':author.a.string,'发布时间':author.contents[5].string,'回 复':reply_view[0].strip(),'浏 览':reply_view[1].strip(),'最后回复时间':endreply.a.string,'最后回复链接':"https://bbs.hupu.com/"+endreply.a['href'],'最后回复人':endreply.span.string})
这样我们就大功告成了,注意代码部分的注释是一些容易被忽视却很常用的重点。
比如:
print('标 题:'+title.a.string)#重点:NavigableString对象获取文本内容的方法
print('标题链接:'+"https://bbs.hupu.com"+title.a['href'])#重点:获取标签内链接的方法
reply_view=reply_view.text.strip().split('/')#重点:对形如23/34这样的字符串进行分割
现在我们来到数据库,查询一下我们的内容:
数据已经被正确的出入进去了。