美文网首页爬虫专题
用Requests+正则表达式爬取糗事百科段子

用Requests+正则表达式爬取糗事百科段子

作者: 1想得美 | 来源:发表于2017-08-18 22:42 被阅读260次

一、介绍

爬取猫眼电影的翻版,练练手的同时也有新发现

二、流程

  • 用浏览器打开糗事百科,分析站点

  • 抓取单页内容
    利用Requests请求目标站点,得到单个网页HTML代码,返回结果

  • 正则表达式分析
    根据HTML代码分析得到的用户名称、段子文本、点赞人数、评论人数等信息

1.png
  • 保存至文件
    通过文件的形式将结果保存,每一部电影一个结果一行Json字符串

  • 开启循环及多线程
    对多页内容遍历,开启多线程提高抓取速度 ,这里为了保证获取文本信息格式的一致性,我就没有不用多线程了

三、代码

import requests
import re
import json
from requests.exceptions import RequestException
import time

def get_one_page(url):
    use_agent='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36'  
    Headers={'User-Agent':use_agent}
    #如果不加报头直接抓取源代码似乎会报错,所以我伪装了一下,打开chrome进入糗事百科,再右键打开检查->network->request headers,把User-Agent复制了
    try:
        response=requests.get(url,headers=Headers)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None

def parse_one_page(html):
    pattern = re.compile('<h2>(.*?)</h2>.*?<span>(.*?)</span>.*?<i cla'
                         + 'ss="number">(.*?)</i> (.*?)</span>.*?<i class="number">(.*?)</i>(.*?)</a>', re.S)
    items=re.findall(pattern,str(html))  #这里要对html用str()函数,不然会报错 TypeError: expected string or bytes-like object
    #print(items)
    for item in items:
        yield {
            'name':item[0].strip(),
            'text':item[1].replace("<br/>",",").strip(),   #替换掉网页中的<br/>转行标签,去掉换行符
            'vote':(item[2]+item[3]),
            'comments':(item[4]+item[5]).strip()
        }

def write_to_file(content):
    with open('result.text','a',encoding='utf-8') as f:
        f.write(json.dumps(content,ensure_ascii=False)+'\n')
        f.close()

def main():
    for i in range(1, 14):
        url = 'https://www.qiushibaike.com/hot/page/' + str(i) #把循环放在这里,不要弄在main()里
        print('当前处理页数:',i)
        get_one_page(url)
        html=get_one_page(url)
        for item in parse_one_page(html):
            print(item)
            write_to_file(item)
        time.sleep(3)

if __name__=='__main__':
        main()      #这是标准的main格式

四、最后得到的text文件

2.png

五、总结

1.磕磕碰碰的做出来,很开心
2.在这里非常感谢皮皮哥、风、Luffy等大佬的悉心指导

相关文章

网友评论

    本文标题:用Requests+正则表达式爬取糗事百科段子

    本文链接:https://www.haomeiwen.com/subject/kvrzrxtx.html