本示例记录一下python爬取微博遇到的坑以及学到的东西。首先不得不承认pyquery在提取信息方便还是相当便捷的,尤其是本次提取文本信息时,相当给力。可能主要还是对各种解析库不熟练吧,遇到一个说一个好。唉.....
遇到的第一个问题是url构造的问题,微博构造url还是比较简单的,在爬取搜索关键词后的信息时其url大致为
https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%25E4%25B8%258A%25E6%25B5%25B7&page_type=searchall&page=4
中间被变成URL编码的字符串为‘=1&q=关键词’。按道理来说也没有什么难度,但是刚开始我自作聪明,把这些都直接用字符串写了出来,关键词也用汉字写了出来,当请求时就会发现,得到的就不是自己想要的内容。因此:第一个坑就是要将构造的url的这一部分内容自己转码成URL编码格式,其大致方法为:
import urllib.parse
S = 字符串
urllib.parse(S)
即可将S字符串的内容转换成URL编码格式。
第二个问题,哦 ...... 第二个问题刚刚发现是我多虑了。第一页url可以直接在后边加page=1,这个没问题。我还以为这个是个坑,刚刚验证了一下,能行。.....
第三个问题,保存为csv时,设置表头。现在还没有解决,目前我只能自己在刚开始先建个表头,后边再追加信息,希望有会的大佬,指点一下,一会我再继续查资料。
第四个问题,csv文件显示问题。将文件保存为utf-8时会发现,去用Wps或者Excel打开时会出现乱码的情况。解决方法就是将保存文件时的编码格式改为windows下excel支持的格式,也就是‘GB18030’。虽然在pycharm中可能显示的是乱码的。但毕竟点击一下Reloading in another encoding就可以看。显然保存时改编码格式还是比较方便的。
另外说一句,火狐看这种json格式的链接体验是真的好。 哈哈...... 笑出猪叫
'''
输入想要搜索话题的关键词将搜索内容保存至以关键词命名的csv文件中
'''
import requests
from pyquery import PyQuery as pq
import csv
import time
import random
import urllib.parse
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3766.400 QQBrowser/10.6.4163.400',
'origin': 'https://weibo.com',
}
def get_resposne(url):
try:
response = requests.get(url, headers=headers)
response.encoding = response.apparent_encoding
response = response.json()
return response
except:
return ''
def parse_response(response):
mblogs = response['data']['cards']
datas = []
for mblog in mblogs:
if 'mblog' in mblog:
collections = {}
mblog = mblog['mblog']
collections['博主'] = mblog['user']['screen_name']
collections['微博文本内容'] = pq(mblog['text']).text()
collections['微博文本长度'] = mblog['textLength']
collections['评论数'] = mblog['comments_count']
collections['转发数'] = mblog['reposts_count']
collections['点赞数'] = mblog['attitudes_count']
collections['粉丝数'] = mblog['user']['followers_count']
datas.append(collections)
return datas
def save_datas(datas, keyword):
with open(f'{keyword}.csv', 'a', newline='', encoding='gb18030') as csvfile:
fieldnames = ['博主', '微博文本内容', '微博文本长度', '评论数', '转发数', '点赞数', '粉丝数']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writerows(datas)
def main():
keyword = input('请输入想要搜索的关键词:')
url_add = '=1&q=' + keyword
url_add = urllib.parse.quote(url_add)
with open(f'{keyword}.csv', 'a', newline='', encoding='gb18030') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['博主', '微博文本内容', '微博文本长度', '评论数', '转发数', '点赞数', '粉丝数'])
base_url = 'https://m.weibo.cn/api/container/getIndex?containerid=100103type{}&page_type=searchall'.format(url_add)
for page in range(1, 51):
if page == 1:
url = base_url
else:
url = base_url + '&page=' + 'page'
response = get_resposne(url)
if response:
save_datas(parse_response(response), keyword)
print('第{}页保存完成'.format(page))
time.sleep(random.randint(15, 20))
else:
break
main()
小胖胖的猪崽