爬虫学习相关(持续更新)

这学期写了点前后端,学期末那几天又看了点计网,大概是时候写明白爬虫了。

爬虫的道理很简单:
1.爬取html代码
2.进行数据采集

客户机向服务器请求的方式有以下几种:
GET、HEAD、POAT、PUT、PATCH、Delete、OPTIONS
所以request模块提供了这些方法用来模拟浏览器向服务器发送请求
暂时只用了request.get写了点东西

众所周知,get有四种传参方式,最常见的就是url传参。

构造一个url链接
360搜索的链接是 https://www.so.com/s
使用360查询RNG的链接是 https://www.so.com/s?q=RNG
我们会发现 在360的原链接后面加上s?wd=xxx 就是360搜索xxx的链接
可见360搜索通过提交表单使用url传参进入指定的页面
那么 我们显然可以用python的request模块,模拟表单的提交。
举个例子:

import requests
url = "https://www.so.com/s"
param = {'q':'RNG'}
html = requests.get(url,params = param)
print(html.text)

输出如下:

其他参数

1)data:字典、字节序列或文件对象,作为request的内容

2)json:JSON格式的数据作为request的内容

3)headers:字典,HTTP定制头

4)cookies:字典或Cookiejar

5)auth:元组,支持HTTP认证功能

6)file:字典,传输文件

7)timeout:超时时间,以秒为单位

8)proxies:字典,设置代理服务器,可以增加登陆认证

9)allow_redirects:True或False(默认True),重定向开关,是否允许对url进行重定向

10)stream:True或False(默认True),获取内容立即下载开关

11)verify:True或False(默认True),认证SSL认证开关

12)cert:保存本地SSL路径开关

(参考自https://blog.csdn.net/abc_12366/article/details/79824660

了解http请求头的话,对以上应该不会陌生。

以cookie为例模拟登陆。
众所周知,微博网页版只能看到别人的粉丝数和关注数,并不能看到具体名单。
但是可以看自己的粉丝和关注名单。
每个人的微博其实都有一个ID,但是仅仅通过url传参实现登陆微博显然是不现实的,你只能访问到别人的主页。
可以通过提交cookie实现登陆。
(要保护好自己的cookie不能让别人知道!)

这里以爬取自己的粉丝和关注名单为例
(请忽略我拙劣的Python水平)
代码如下:

import requests
from lxml import etree
import json
from bs4 import BeautifulSoup
import time
import re
from prettytable import PrettyTable

starttime = time.time()
fansname = []
follow = []
fans = []

for p in range (1,6):
    url = "https://weibo.com/(yourweiboID)/fans?cfs=600&relate=fans&t=1&f=1&type=&Pl_Official_RelationFans__90_page="+str(p)
    header={"Cookie":'yaobaohuhaozijidecookie'}   #输入你的cookie。怎么查看cookie?右键->检查->network
    html = requests.get(url,headers=header)
    text = html.text
    fans_json_list = text.split("<script>FM.view")
    content = fans_json_list[len(fans_json_list)-2]
    i = content.find("<!--粉丝列表-->")
    content = content[i:].replace("\\n","").replace("\\","")
    soup = BeautifulSoup(content, 'html.parser')

    for k in soup.find_all('a',class_ = 'W_btn_b'):  #获取html中标签a class为‘W_btn_b’的点
        k = str(k)
        i = k.find('fnick')
        j = k.find('&',i)
        if (i>0 and j>0):
            fansname.append(k[i+6:j])

    for k in soup.find_all('a',href = re.compile('/follow')):
        k = str(k)
        i = k.find('_blank">')
        j = k.find('<',i)
        if (i>0 and j>0):
            follow.append(k[i+8:j])

    for k in soup.find_all('a',href = re.compile('current=fans')):
        k = str(k)
        i = k.find('_blank">')
        j = k.find('<',i)
        if (i>0 and j>0):
            fans.append(k[i+8:j])

endtime = time.time()
num = len(fans)
print("总计花费"+str(endtime-starttime)+"秒")
print("共有"+str(num)+"个粉丝")
x= PrettyTable(["昵称", "粉丝数", "关注数"])
for i in range (0,num):
    x.add_row([fansname[i],fans[i],follow[i]])
print(x)

输出如图:

一些解释:
1、比我想象的复杂了一点点。新浪微博的粉丝部分的内容被放在script标签中动态抓取,而爬虫爬取到的页面是静态的,没有进行任何的Ajax提交。
如何爬取到JS代码执行完的html代码网上也有很多方法,此处暂不讨论。

2、将script标签内的html筛选出来是重点。因为它是这样的:

3、关于beautifulsoup
我在此处只有对beautifulsoup最简单的应用。
抓取标签为a且class为’W_btn_b’的标签内容

for k in soup.find_all('a',class_ = 'W_btn_b'):
        print(k)

抓取标签为a且href中有’/follow’的标签内容

for k in soup.find_all('a',href = re.compile('/follow')):
        print(k)

更多用法参见官方文档

4、关于xpath的使用
一开始用的是xpath进行数据整理,但是由于不够熟练,还是换成了beautifulsoup。
关于xpath:
https://blog.csdn.net/a417197457/article/details/81143112
这篇用来了解入门是极好的。

总结:学明白计网,会写些网页,再来看爬虫也不迟。明白写和糊涂写天差地别。

如果觉得有帮助或者觉得作者辛苦欢迎留言或者点赞!
如果有疑问欢迎评论区交流!

发表评论