爬微博onlyanose的可爱漫画

遇到的问题与解决

Posted by 周自横 on March 15, 2020

爬取微博onlyanose的可爱漫画

微博爬取必备cookie

在微博爬取内容必须需要你自己的cookie,否则会被重定向获取到微博的登录界面的内容。

cookierequests中的使用方式为:

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张。