illuminate123 发表于 2022-10-12 22:57

python爬取微博评论

本帖最后由 illuminate123 于 2022-10-13 09:47 编辑




!%5Bimage-20221012225013686%5D()


效果还不错,爬了100000多个评论


本次用selenium关于selenium的下载及安装,这里不在讲述https://typoracsdnzhihu.oss-cn-nanjing.aliyuncs.com/image-20221012225013686.png

# 说明本次使用的是手机版微博
# 地址为https://m.weibo.cn/
# 爬取评论的地址应该类型于https://m.weibo.cn/detail/4812281315337380
from selenium.webdriver.support.wait import WebDriverWait# 显示等待,登陆好了咱就爬取
from tqdm import tqdm
import csv
import time
from time import sleep

from fake_user_agent import user_agent
from selenium import webdriver
from selenium.webdriver.common.by import By
import numpy as np

with open("李易峰评论.csv", 'w') as f:
    csv_writer = csv.writer(f)
    csv_writer.writerow(["nick_name", "content", "time", 'location'])
us = user_agent()
headers = {
    'user_agent': us
}
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
###
driver = webdriver.Chrome(options=chrome_options)

def scrape(url):
    driver.get(url)
    time.sleep(20)# 你先登录,再加上验证码最低也要20s吧,下滑界面5s左右就会让你登录
    # 下面这个解释一下:等待20s继续等待,在等待30s,如果再次期间登录完毕就开始爬,每隔0.2s就检查一次
    # 如果,我是说如果50s你都登录不好,那你确实废物,哈哈哈,开个玩笑,我才是废物
    text = WebDriverWait(driver, 30, 0.2).until(
      lambda x: x.find_element(By.XPATH, '//*[@id="app"]/div/div/div/div/h4')).text
    print(text)
    print("请登录,下滑页面登录")
    print("*" * 100)
    for i in tqdm(range(100000), colour="yellow"):
      driver.execute_script("window.scrollBy(0,100)")

      nick_name = driver.find_elements(By.XPATH,
                                       '//*[@id="app"]/div/div/div/div/div/div/div/div/div/div/div/div/div/h4')
      content = driver.find_elements(By.XPATH,
                                       '//*[@id="app"]/div/div/div/div/div/div/div/div/div/div/div/div/div/h3')
      time_local = driver.find_elements(By.XPATH,
                                          '//*[@id="app"]/div/div/div/div/div/div/div/div/div/div/div/div')
      for i, j, k in zip(nick_name, content, time_local):
            with open("李易峰评论.csv", 'a', encoding="utf-8-sig", newline='') as f:
                csv_writer = csv.writer(f)
                csv_writer.writerow(, k.text.split("来自")])
                # print(i.text, ":", j.text, ":", k.text.split("来自"), k.text.split("来自"))
      time.sleep(abs(np.random.randn(1)) / 10)
    driver.quit()
    driver.close()

url = "https://m.weibo.cn/detail/4812281315337380"# 这里修改自己的url
scrape(url)

爬完总共大概有10000条吧


我写的代码,中间有问题,导致有大量重复数据,这个要等我晚上改一下(两个手机号都登录不了微博了,验证码接受次数上限了)

illuminate123 发表于 2022-10-13 09:44

TRACEYOU 发表于 2022-10-13 09:30
请问tqdm模块是为了下面那个进度条吗,time.sleep(abs(np.random.randn(1)) / 10)这个睡眠中的函数是什 ...

进度条啊
休眠的时间的随机的,服从正态分布的
因为正态分布的数值可能小于0,所以给他一个abs(绝对值)
我是借用np模块,返回一个列表,取它的第一个数值
再让他÷10休眠不是那么久
我写的代码,中间有问题,导致有大量重复数据,这个要等我改(两个手机号都登录不了微博了,验证码接受次数上限了)

illuminate123 发表于 2022-10-13 09:46

狂笑一君 发表于 2022-10-13 09:26
如果我想爬取一个漫画网站的所有漫画用selenium好还是Scrapy好?还是有别的框架更合适?

漫画网站一般都是图片吧,图片的画主要是找链接
先试试requests能不能找到图片链接
再试试selenium能不能定位到

ych13846701169 发表于 2022-10-12 23:24

这么牛,学不会

wzyl 发表于 2022-10-12 23:31

优秀啊楼主 支持一波

dokuro 发表于 2022-10-13 01:52

可以啊,学习了

bingtuzibb 发表于 2022-10-13 02:49

真羡慕啊想学习 无从下手

CH3CH2COOH 发表于 2022-10-13 08:30

厉害呀老哥

magicny 发表于 2022-10-13 08:56

牛人,看不懂,先留着。

狂笑一君 发表于 2022-10-13 09:26

如果我想爬取一个漫画网站的所有漫画用selenium好还是Scrapy好?还是有别的框架更合适?

TRACEYOU 发表于 2022-10-13 09:30

请问tqdm模块是为了下面那个进度条吗,time.sleep(abs(np.random.randn(1)) / 10)这个睡眠中的函数是什么意思,option设置是为了伪装不被发现是selenium?

hk137 发表于 2022-10-13 09:42

可以啊,学习了
页: [1] 2 3
查看完整版本: python爬取微博评论