重要提示1:本文所列程序均基于Python3.6,低于Python3.6的Python版本可能无法运行. 重要提示2:因所抓取的网站可能随时更改展示内容,因此程序也需及时跟进. 重要提示3:本程序仅供学习,不能拿去做坏事.
重要提示1:本文所列程序均基于Python3.6,低于Python3.6的Python版本可能无法运行. 重要提示2:因所抓取的网站可能随时更改展示内容,因此程序也需及时跟进. 重要提示3:本程序仅供学习,不能拿去做坏事.
1.安装Python 3.6; 2.安装以下库: 1. requests(2.12.4); 2. BeautifulSoup(4.5.1)(pip install beautifulsoup4); 3. urllib3(1.19.1);
整个程序,按照下面的步骤:
1.获取要爬取页面的URL地址(可以是分页地址,可以在程序里面模拟分页); 2.通过requests(一个封装了urllib3的网络库,简化了很多网络请求的东西)下载上面URL地址的内容到内存(以前的方式是保存临时文件); 3.用BeautifulSoup(一个解析HTML的库)来读取第二步中保存在内存中的内容,并解析出我们要的主要内容部分; 4.保存到数据库或展示(特别说明:本示例程序不包含数据库部分),程序最终会输出多条json数据(已经包含了来源网站(自己定义的),创建时间等)
上述部分体现在代码中,就是如下:
首先在Main.py中,定义:
class Budejie(object):
'''
获取格式化后的数据.
'''
def content(self,data):
common = CommonGrab()
return common.formatContent(data,".j-r-list-c-desc")
用来格式化不得姐获取到的数据,下面还要定义一个Qsyk来处理来自糗事百科的数据:
class Qsyk(object):
'''
获取格式化后的数据.
'''
def content(self,data):
common = CommonGrab()
return common.formatContent(data,".content")
代码中还有一个Kanqu.com的抓取处理,这里就不罗列了,这几个唯一的区别就是:调用common.formatContent时,传递的第二个参数不一样,第二个参数为要抓取的内容(HTML)的class.
CommonGrab中依赖了UserUtils.py中的代码.
下面是CommonGrab的定义,在CommonGrab中主要做了两件事: 1. 抓取网页内容,保存到内存; 2. 解析HTML内容(使用BeautifulSoup) 3. 将数据新增到数据库中.(不新增数据库到数据库中.)
代码如下:
class CommonGrab(object):
'''
抓取网页文件内容,保存到内存
@url 欲抓取网站地址
'''
def getPageData(self, urls, pageSize,network,timeout=(20.0,20.0)):
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36"}
htmldata = []
startItem = 1
for x in range(startItem, pageSize):
tmpurl = ""
tmpurl = urls + "%d" % (x)
data = network.requestsGet(url=tmpurl,headers=headers,timeout=timeout)
htmldata.append(data.text)
return htmldata
'''
解析HTML内容(使用BeautifulSoup).
@data:数据内容.
@formatStyle:格式化参数.例如:css的名称或者div的id.
返回整理过的数据列表.
'''
def formatContent(self,data,formatStyle):
bs = BeautifulSoup(data,"html.parser")
htmlutil = HTMLUtils()
return [htmlutil.replaceAllHtmlTag(x.text) for x in bs.select(formatStyle)]
# 将数据新增到数据库中.(不新增数据库到数据库中.)
# dataarray - >数据. 必选
# source -> 来源,例如:qiushibaike. 必选
def insertDataDB(self,dataarray,source):
date = DateUtils()
createDate = date.formatDateToStr(formatv=FormatDates.YY_MM_DD_HH_MM_SS)
if dataarray and source:
insertda = [({"value":""+item.replace("\n","").replace("\\","").replace("\\u3000","").replace("n","")+"","source":""+source+"","createDate":""+createDate+""}) for item in dataarray]
print(insertda)
#
# 此处可以直接将数据插入数据库.
# 之前是使用MongoDB数据库.
# 为避免测试难度,去掉了数据库部分的代码.
# 如有需要,可自行选择数据库并进行新增等操作.
#
之后就是把上述的几部分组合起来.
运行部分的代码如下,主要就是调用了上述几部分的代码:
print("正在执行......稍等一会")
qs = Qsyk()
cg = CommonGrab()
fileutil = FileUtils()
network = NetWorkUtils()
#尽量不要大于10.
# pageSize = 10
pageSize = 2
# ----------------------------------------
# 上面是通用操作.
#
#
#
# ------------------------------------------------
#糗事百科抓取配置.
# '''下载配置'''
qiubaiurl = "http://www.qiushibaike.com/textnew/page/"
# '''下载html文件'''
htmls =cg.getPageData(qiubaiurl, pageSize,network)
qsbkdata= qs.content(str(htmls))
#糗事百科抓取END.
#不得姐下载配置
budejieurl="http://www.budejie.com/text/"
#下载html文件.
budejiehtml=cg.getPageData(budejieurl,pageSize,network)
bdj=Budejie()
bdjdata=bdj.content(str(budejiehtml))
#不得姐下载END.
#kanqu下载配置
kanquurl = "http://www.kanqu.com/cat/1?page="
kanquhtml = cg.getPageData(kanquurl,pageSize,network)
kanqu = KanQu()
kanqudata = kanqu.content(str(kanquhtml))
#kanqu下载配置END.
# 新增数据到数据库.
cg.insertDataDB(qsbkdata,"qiushibake")
cg.insertDataDB(bdjdata,"budejie")
cg.insertDataDB(kanqudata,"kanqu")
# 新增数据到数据库END.
CSDN: https://download.csdn.net/download/dcxy0/9835268 Coding.net: https://coding.net/u/pruidong/p/Python3GetQsbkBdj/git
文件:
main.py: 运行 UserUtils.py:工具
Python 3.7 将于2018-06-15发布(参考:PEP537).
到时可能会依据Python 3.7更新此程序.
异步社区是一个有料、有货,又专业的IT专业图书社区,在这里可以读到最新、最热的IT类图书!我想要社区的《Python程序设计(第3版)》这本书,Python之父推荐,人生苦短,我用Python,一定要看,请大家帮我点赞!