爬取微博onlyanose
的可爱漫画
微博爬取必备cookie
在微博爬取内容必须需要你自己的cookie
,否则会被重定向获取到微博的登录界面的内容。
cookie
在requests
中的使用方式为:
cookie = {'Cookies':'your cookie'}
requests.get(url,cookies = cookies)
获取请求得到内容
requests.get()
获取到的内容直接输出得到的是状态码,获取其中内容需要具体属性,文本文件.text
,二进制文件.content
。
由于文本文件经常编码存在有问题,使用.decode('utf-8')
进行解码
正则匹配
re.search()
,返回第一个匹配的内容,直接返回的是bool
值,需要使用.group(1)
获取匹配的内容
.group()
在正则匹配中用于返回所需的内容,当参数为0
返回的是匹配的字符串的本身,参数为1
开始,返回的是符合条件的匹配内容
列表追加与扁平化
使用list.append()
若是追加的内容为一个列表,那么这个列表就会作为原列表的元素,形成列表嵌套。
若是想获取其中的每一个内容,使用set
是没有效果的,因为list
属于可迭代对象,d但是其中元素也是列表。所以扁平化应该使用函数解决。
针对列表可能存在嵌套并且嵌套长度未知的时候,使用以下代码,使用isinstance
判断元素是否为列表,若是确定嵌套并且长度固定,有更简单的方法,在搜索过程有见到但是具体实现未知。
def flat(nums):
res = []
for i in nums:
if isinstance(i, list):
res.extend(flat(i))
else:
res.append(i)
return res
文件操作
正常文件的操作是:
f = open(filename,'r/w/a')
pass
f.close()
但是由于存在文件未闭包的风险,所以常用的是:
with open(name,'r/w/a') in f:
f.write(some)
在使用第二种方式的时候,由于我是创建新文件写入,文件名是存在变化的,在jupyter
中有提示我错误为:文件名参数不能迭代生成。所以在正式实现的时候我是用了第一种方式,随后我有在其他程序也是迭代的情况下写入文件,使用的直接是.py
没有遇到这个问题,所以不清楚是程序本身的问题还是由于jupyter
的原因
此次爬取的思路(懒得重新看,靠回忆)
查看微博图片的存储时发现微博默认存入的个人相册中的微博相册。在网络请求中可以看到有个获取相册中所有专辑的一个请求,还有获取每个专辑的请求。其中单独专辑的请求中包含这个相册专辑的总图片数量,这个专辑需要的参数其中有每次请求图片的数量以及页数,存在有其余内容但是并没有再深入研究。可以直接使用微博自己使用的请求数为30,至于页数直接按照总图片数进行计算。
本次爬取的内容放在了onedrive,由于总页数为19,从1开始,未注意到这点,所以目前少了30张。