mymoon 发表于 2021-4-18 10:58

怎么爬关于某热点话题的讨论?

1、去哪里爬?微博、知乎、贴吧、论坛、豆瓣等都有讨论,去哪里爬?都爬还是选择性的爬?
2、关于这个话题,有用户发表的回答(或帖子、博客),还有评论,还有用视频或图像等传达信息的,要爬什么?
3、这样的话题爬虫该选什么框架爬啊?
我感觉自己被困住了,理不清从哪里开始。

逗帆云视 发表于 2021-4-18 12:03

import urllib.request
import re

url = "http://news.baidu.com/"
#header参数是一个字典,将爬虫伪装浏览器用户
header = {
    'User-Agent':'User-Agent:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'
}
req = urllib.request.Request(url,headers=header)

#执行请求获取响应信息
res = urllib.request.urlopen(req)

# 从响应对象中读取信息并解码
html = res.read().decode("utf-8")

#使用正则表达式筛选新闻标题信息
pat = '<a href="(.*?)" .*? target="_blank">(.*?)</a>'

#获取字符串html中所有匹配的pat,返回一个data的列表
data = re.findall(pat,html)

#把列表data 遍历输出结果
for v in data:
    print(v+":"+v)

Stan_Lee 发表于 2021-4-18 13:25

微博、知乎、贴吧、论坛、豆瓣这些个网站都爬!我是直接在这个网站直接爬的!
https://tophub.today/

mymoon 发表于 2021-4-19 16:05

逗帆云视 发表于 2021-4-18 12:03
import urllib.request
import re



你好,我想问一下,如果我想爬所有论坛(微博、知乎等,还有一些媒体报道)中“五一小长假”这个话题,看看大家都在讨论什么,我该怎么爬呢?

逗帆云视 发表于 2021-4-19 16:25

mymoon 发表于 2021-4-19 16:05
你好,我想问一下,如果我想爬所有论坛(微博、知乎等,还有一些媒体报道)中“五一小长假”这个话题,看 ...
新浪微博的例子如下
1.初始
这里使用简便式登陆,url = '登录的连接'
2.提交postdata
在IE浏览器中手动输入用户名密码(不点下次自动登陆和安全登陆),分析fiddler,得到最终的登陆结果需,要提交部分
3.后续
在登陆成功后,只要设定query和爬取的页数,循环爬取就可以了,爬到了html文件,用bs解析即可得到包含关键字的微博。找到了页面分分钟爬下来
4
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 08 17:10:36 2016
@author: Administrator
"""

#coding=utf8
from bs4 import BeautifulSoup as bs
import urllib
import urllib2
import cookielib
import base64
import re
import json
import hashlib
import rsa
import binascii

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

pubkey = 'EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443'
cj = cookielib.LWPCookieJar()
cookie_support = urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
postdata = {
    'entry': 'weibo',
    'gateway': '1',
    'from': '',
    'savestate': '7',
    'userticket': '1',
    'ssosimplelogin': '1',
    'vsnf': '1',
    #'vsnval': '',
    'su': '',
    'service': 'miniblog',
    'servertime': '',
    'nonce': '',
    #'pwencode': 'wsse',
    'pwencode': 'rsa2',
    'sp': '',
    'pagerefer':'http://login.sina.com.cn/sso/logout.php?entry=miniblog&r=http%3A%2F%2Fweibo.com%2Flogout.php%3Fbackurl%3D%252F',
    'raskv':'',
    'sr':'1440*900',
    'prelt':'94',
    'encoding': 'UTF-8',
    'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
    'returntype': 'META'
}

def get_servertime():
    url = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=dW5kZWZpbmVk&client=ssologin.js(v1.3.18)&_=1329806375939'
    data = urllib2.urlopen(url).read()
    p = re.compile('\((.*)\)')
    try:
      json_data = p.search(data).group(1)
      data = json.loads(json_data)
      servertime = str(data['servertime'])
      nonce = data['nonce']
      rsakv=data['rsakv']
      return servertime, nonce,rsakv
    except:
      print 'Get severtime error!'
      return None

def get_pwd(pwd, servertime, nonce):
    #pwd1 = hashlib.sha1(pwd).hexdigest()#旧的加密方式,pwencode的值需要为wsse
    #pwd2 = hashlib.sha1(pwd1).hexdigest()
    #pwd3_ = pwd2 + servertime + nonce
    #pwd3 = hashlib.sha1(pwd3_).hexdigest()
    #return passwd
      global pubkey
      rsaPublickey = int(pubkey, 16)
      key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥
      message = str(servertime) + '\t' + str(nonce) + '\n' + str(pwd) #拼接明文js加密文件中得到
      passwd = rsa.encrypt(message, key) #加密
      passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。
      print passwd
      return passwd


def get_user(username):
    username_ = urllib.quote(username)
    username = base64.encodestring(username_)[:-1]
    return username


def login():
    username = '你的登录邮箱'
    pwd = '你的密码'
    url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)'
    try:
      servertime, nonce,rsakv = get_servertime()
    except:
      return
    global postdata
    postdata['servertime'] = servertime
    postdata['nonce'] = nonce
    postdata['rsakv'] = rsakv
    postdata['su'] = get_user(username)
    postdata['sp'] = get_pwd(pwd, servertime, nonce)
    for i in postdata:
      print i,":", postdata#可以看提交的哪些数据
#    print postdata["su"]
#    print postdata["sp"]
    postdata = urllib.urlencode(postdata)
    headers = {'User-Agent':'Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0'}
    req= urllib2.Request(
      url = url,
      data = postdata,
      headers = headers
    )
    result = urllib2.urlopen(req)
    text = result.read()
    #print len(text)
    #print 30*"*"
    #print text
    #p = re.compile('location\.replace\(\'(.*?)\'\)')#p = re.compile('location\.replace\(\'(.*?)\'\)')
    p = re.compile('location\.replace\(\"(.*?)\"\)')
    login_url = p.findall(text)
      
    #login_url = p.search(text).group(1)
    print login_url
    print 30*"*"
    try:
      result1 =urllib2.urlopen(login_url).read()
      fres = open("fres.txt","w")
      fres.write(result1)
      fres.close()
#      print len(result1)
#      print type(result1)
      print u"登录成功!"#是否登录成功还要看result1的内容是否是别的什么,
      
      query = "深圳禁摩限电"
      page_num = 1
      url = "http://s.weibo.com/weibo/{0}&b=1&nodup=1&page={1}".format(query, page_num)
      #http://s.weibo.com/weibo/深圳禁摩限电&b=1&nodup=1&page=1
      print url.encode("gbk")
      #newurl = "http://baike.baidu.com"+suburl
      req = urllib2.Request(url)
      html = urllib2.urlopen(req).read()
      #print html
#      html = urllib2.urlopen(url)
#      req= urllib2.urlparse()      
      #soup = bs(html)
      f_query1 = open("shenzhenlimitcar_sf.html","w")
      f_query1.write(html)
      f_query1.close()
    except Exception,e:
      print 'Login error!'
      print e
if __name__=="__main__":
    login()

raelag 发表于 2021-4-20 15:43

爬标题、链接、摘要,就变成rss阅读器

mymoon 发表于 2021-4-20 19:21

raelag 发表于 2021-4-20 15:43
爬标题、链接、摘要,就变成rss阅读器

能从网页上爬取多个链接,然后循环访问这些链接,用一种统一的爬虫爬取这些链接里的文本吗?我想爬一个话题的多个网站的新闻报道,不太清楚这可不可行,还是一个链接有一个链接的爬取方式呢?

raelag 发表于 2021-4-21 15:51

mymoon 发表于 2021-4-20 19:21
能从网页上爬取多个链接,然后循环访问这些链接,用一种统一的爬虫爬取这些链接里的文本吗?我想爬一个话 ...

不同网站的链接结构不一样,同一网站应该一样的。
以网站为单位,先分别爬每个网站进行处理,最后再把结果聚合起来
页: [1]
查看完整版本: 怎么爬关于某热点话题的讨论?