python爬虫1
in Default with 0 comment
Read:35

python爬虫1

in Default with 0 comment

python的作用,很多人都知道一点收集网站数据——爬虫

网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。其目的一般为编纂网络索引。

其实,许多人口中所说的爬虫(web crawler),跟另外一种功能“网页抓取”(web scraping)搞混了。

即便你用浏览器手动拷贝数据下来,也叫做网页抓取.但是人都比较懒,怎么可能自己动手复制,也就是说,用爬虫(或者机器人)自动替你完成网页抓取工作,才是你真正想要的。

数据抓下来干什么呢?

一般是先存储起来,放到数据库或者电子表格中,以备检索或者进一步分析使用。
所以,你真正想要的功能是这样的:
找到链接,获得Web页面,抓取指定信息,存储。
这个过程有可能会往复循环,甚至是滚雪球。
你希望用让python程序自动帮你完成。

Python语言的重要特色之一,就是可以利用强大的软件工具包(许多都是第三方提供)。你只需要编写简单的程序,就能自动解析网页,抓取数据。

目标

本来我又个python的任务是爬新闻网,我看了一下那些新闻网,太tm乱了,算了算了,换一个爬,所以我就去爬了小说网站。
你想要什么小说,自己百度。不要找收费的小说,要免费的。

比如我要爬《完美世界》
首先我要找到小说网站的主页面,记住网址,如下图:
QQ截图20190216203558.png

程序

读入网页加以解析抓取,需要用到的软件包是 requests_html 。我们此处并不需要这个软件包的全部功能,只读入其中的 HTMLSession 就可以。(你没有安装是不能引用的,怎么安装——python第三方库安装问题)

from requests_html import HTMLSession

然后,我们建立一个会话(session),即让Python作为一个客户端,和远端服务器交谈

session = HTMLSession()

前面说了,我们要爬完美世界小说,找到网址,保存到变量url

url = 'https://www.fengyunok.com/2909/'#完美世界小说

下面的语句,利用 session 的 get 功能,把这个链接对应的网页整个儿取回来。

r = session.get(url)

网页里面都有什么内容呢?
我们告诉Python,请把服务器传回来的内容当作HTML文件类型处理。我不想要看HTML里面那些标签,只看文字部分。

print(r.html.text)

QQ截图20190216204809.png

我想要每一章节的内容,我就要一个一个点击章节名字的链接进去,才能跳转到内容

r.html.links#获取当前界面的全部连接

虽然能获得全部链接,但是,一个网页有很多其他的链接,比如广告链接,菜单链接等,这些是我们用不到的链接,我们要爬取小说内容,我们只需要每一章的链接。
如果你会html,你应该知道,网页的布局一般都是一块一块的,有规律性的。
我们打开小说章节目录的f12,然后选中第一章的a标签,右键复制,复制选择器
QQ截图20190216205833.png
多复制几章的选择器,,然后比较
QQ截图20190216210208.png

你会发现,天啦,感觉差不多,有点细微的差别。每一章都指向td的第x个子标签,哇,原来他们全是

`body > div.readerListBody > div.readerListShow > table > tbody > tr:nth-child(2) > td > a`

标签下的啊。
然后我们返回python编辑器,定义一个变量sel来储存它

sel = '.ccss>a'#完美世界的章节链接的选择器

到这里你就会疑问了,为什么上面的这么长,你这里定义的sel这么短,首先请你去了解css选择器。上面弄那一段长的通过浏览器获得的,我爬不到,然后自己根据css排版的直觉取了一个短的选择器,正好能指中每一章的链接。

我们让 Python 从返回内容中,查找 sel 对应的位置,把结果存到 results 变量中。

results = r.html.find(sel)

现在results里面有什么
我们打印一下results,会得到:
QQ截图20190216211756.png
是所有章节的链接的集合

print (results[0].absolute_links)
#索引代表第几章,`.text`是返回这一个a标签的文本,`.absolute_links`是返回绝对路径
print (results[1].text)
print (results[2].text)

QQ截图20190216212521.png
路径是返回的集合,我们不想要集合,只想要其中的链接字符串。所以我们先把它转换成列表,然后从中提取第一项,即网址链接。

list(results[0].absolute_links)[0]

小结

通过处理第一个链接,我们可以获得每一章内容的链接和标题内容,可是,如果每找一个链接,都需要手动输入上面这若干条语句,那也太麻烦了。所以就编写了一个函数

#获取字典,键是标题,值是内容链接
def get_text_link_from_sel(sel):
    mylist = []
    try:
        results = r.html.find(sel)
        for result in results:
            mytext = result.text
            mylink = list(result.absolute_links)[0]
            mylist.append((mytext, mylink))
        return mylist
    except:
        return None

解释一下上面的函数:mylist是一个字典集合,把所有的文章标题储存位keys,目标链接储存为values。for result in results遍历results里面的全部内容

获取到了数据,我们就应该放到数据库里面,这里用sql server2012.
python想要链接sql server数据库,需要引入第三方软件包pymssql,同样需要自己安装

import pymssql

导入了pymssql,然后就是链接数据库,方法很多,我又不是全部都会,我只举出我会的。

server = "."#服务器,这里是本地
user = "sa"#账号
password = "123456"#密码
conn = pymssql.connect(server, user, password, "news")#链接数据库,最后一个为数据库
cursor = conn.cursor()#创建一个游标对象,python里的sql语句都要通过cursor来执行

数据库连接完成,现在我们要理一下思路,我峨嵋你需要哪些数据,小说章节名字,内容,原文链接,现在还差每一章的内容
我们有一个字典集合里面保存了每一章的原文链接
现在我们遍历这个字典的value,进入每一章原文,通过上面的方法,获得原文内容

#循环获取完美每一章的内容
for i in range(0,2000,1):#i返回每一个键值对的索引,2000我瞎几把写的,自己根据情况斟酌
    url2=get_text_link_from_sel(sel)[i][8]#每一章原文的链接
    title = get_text_link_from_sel(sel)[i][0]#每一章的题目
    r2 = session.get(url2)#得到新连接的界面内容
    sel2='#content'#原文的选择器
    results2 = r2.html.find(sel2)#通过选择器准确获得目标文本
    content=results2[0].text

     #插入数据库
    cursor.execute("insert into tb_news  values ('{0}','{1}',getdate(),'{2}')".format(title,content,url2))
    conn.commit()  # 你必须调用 commit() 来保持你数据的提交
    num = cursor.rownumber  # 显示插入了几条数据
    if num > 0:  # 判断有没有插入成功的
        print("{0}:爬取成功".format(title))

然后运行,python就开始爬数据了,爬得有点慢
QQ截图20190216215314.png
QQ截图20190216215349.png

如果对你有帮助,打钱

赞赏



Responses