代码备份

1. 提取静态网页

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import requests
from bs4 import BeautifulSoup
from lxml import etree
import re

huawei_mate10_pro_ua = 'Mozilla/5.0 (Linux; U; Android 8.1.0; zh-cn; BLA-AL00 Build/HUAWEIBLA-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/8.9 Mobile Safari/537.36'
chrome ='Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'

# 得到str格式的html,可以用Beautiful Soup去煲汤
# 得到的str格式的,分两种情况去处理,一种利用xpath,另外一种利用BeautifulSoup
def getHTMLText(url):
headers = {
'User-Agent': chrome
}
try:
r = requests.get(url, headers = headers)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.status_code)
return r.text
except:
return "error"

def getbf(url):
# url = 'https://m.nvshens.net/rank/2.html'
# ulr ='http://www.matrixz.top/aria2/trackers_best.txt?preview'

#调用getHTMLText函数,得到函数格式
r = getHTMLText(url)

#利用BeautifulSoup转化为bf格式
soup = BeautifulSoup(r, 'lxml')

return soup
# # res = soup.content.find_all("div",{"class",re.compile(r'.*-content')})
# for i in res:
# print(i.get_text())
#这里soup.div.content返回的还是Tag格式的,一直可以搞下去,其实也挺方便



def getxpath(url):
###这里利用Xpath去处理,主要不能结合正则表达式不好用
r = getHTMLText(url) # 调用一下这个得到文本格式的函数
sel = etree.HTML(r) #变成xpath的格式

# 然后调用sel.xpath(//'')
# e.g con = sel.xpath('//div[@class="article-title"]/@a|//div[@style="text-align:center;"]/text()')

return sel #输出这种格式

2. 提取动态网页

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
# chrome_options.add_argument('window-size=1920x3000') #指定浏览器分辨率
# chrome_options.add_argument('--disable-gpu') #谷歌文档提到需要加上这个属性来规避bug
# chrome_options.add_argument('--hide-scrollbars') #隐藏滚动条, 应对一些特殊页面
chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度
chrome_options.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
# chrome_options.binary_location = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" #手动指定使用的浏览器位置


def getHTMLtext(url):
try:
driver = webdriver.Chrome('D:\Program Files (x86)\chromedriver\chromedriver.exe',options=chrome_options)
driver.get(url)
driver.switch_to.frame("contentFrame") # 切换到歌单所在的iframe,关键步骤,不然还是没法看到源代码的。
r = driver.page_source # 相当于F12获取网页源代码,得到的是str格式,可以直接利用re去提取数据,也可以利用转化为xpath soup都一样
print(r[2000:3000])
return(r)
finally:
driver.close() # 关闭浏览器,回收资源

3. 利用api,读取json返回数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
url='https://api.vc.bilibili.com/link_draw/v2/Doc/index'
params={
'type':'recommend',
'page_num':0,
'page_size':45
}
headers={
'User-Agent':'Mozilla/5.0(WindowsNT6.1)AppleWebKit/537.36(KHTML,likeGecko)Chrome/58.0.3029.110Safari/537.36',
'Accept-Encoding':'gzip,deflate'
}

r = requests.get(url = url, params = params, headers = headers)

str = r.json() #返回的就是dict格式,直接用来re算了
re.findall(r'https://.*?.(?:jpg|png|gif)', str1)

编写H-Viewer时候遇到的问题。

Bilibili-画友

这个是我第一次尝试用api的格式来提取数据,这也是受到了扒图软件的启发,他给出的例子里面对于这个就是利用了api的格式。
在做这个api的时候基本上没有什么问题,因为这个api也是由扒图软件已经基本上写好的。关键是我想实现评论的功能,本来也是利用Chrome进行抓包获取api,后来我认为会不会是自带的抓包软件并不是很好,所以得到的api并不是真实的api。原因在于我直接复制他写出来的api,得到的是“非常抱歉,该页面暂时无法访问”。所以在这个地方我就一直卡了好久。

后来下载了Fillder软件之后仍然仅有这样的一个地址。是在没办法我返回的api地址直接百度一下,就搜到了这篇文章,对B站各种数据进行抓包分析。里面提到了不要js参数,就可以了。他也说了直接打开肯定打不开。
我还以为是要去掉js参数,其实是一个防跨域操作,在这篇文章说明了要复制到浏览器中打开就行了。
发现还是不行,B站主站看视频之后的评论的话到时真的可以,调用一下api,然后根据文章删除部分。例如

1
2
3
4
https://api.bilibili.com/x/v2/reply?callback=jQuery17208515931759409758_1589506408699&jsonp=jsonp&pn=1&type=1&oid=370658779&sort=2&_=1589506410438
这样的一个地址,去掉jQuery那部分,然后后面去不去的无所谓,就能够得到返回的json格式。
https://api.bilibili.com/x/v2/reply?jsonp=jsonp&pn=1&type=1&oid=370658779
这里直接点击打开也是无所谓的。

但是网上百度了一下还是不知道怎么处理B站画友的api