python 爬取句子迷,多好的一个网站(哭~~)

 别问为什么爬它,问就是佛。

总结放前面:

 1、电脑客户端被针对的情况,将浏览器改为手机浏览器

2、IP被封有点烦,暂时用校园网和宽带顶着(相当于两个IP)

3、多线程加锁保护文件保存和读取。

 

这么好看的句子,当然要爬下来一起分享啦~,其实是想拓展一个私人程序的,哈哈。

 

 来来来,我们F12先看看,多简单哦,

获取页面,然后解析,最后找到我们需要的信息。只放搜寻信息的代码吧,其他都比较简单。

msg =BeautifulSoup(html, "lxml")
msg = soup.find_all('a',class_="xlistju")

然后你会发现只有:一半的句子????,而且所有的句子都是,换行的句子都给你少了一部分?????什么鬼,难道是我打开方式不对?

只截了html的图,代码不想改回去了,反正你会发现换行的东西丢了一半.......

难道是和网易云一样的加密?不会解密啊........

尝试获取句子的页面,进入爬取?你会发现一个更恶心的东西,每次进获取html 的句子不同,绝对加密了!(如果没有,我再多吃几碗大米.....)

我的宽带IP由于访问过多,被封了(GG),服务器返回:403。咋滴,我还有校园网!,哼,杠上了!

换种打开方式看看,我模拟手机浏览器打开,看看。谷歌自带手机浏览器打开网页功能

谷歌浏览器为例子:点击下面这个图标,然后刷新网页就好了。

 

 我们需要找到手机的客户端信息,看包撒:

我直接复制下来了:

headers = {
        "user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) "
                      "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Mobile Safari/537.36",
    }

测试一下,好像并没有发现什么不同,该少的还是少了.......,那进入句子的主要网页呢!

完美,都显示清楚了,果然手机端没这么多烦人的(以为手机端就不会用爬虫了,哼~~),我测试了几遍都没问题。(访问了几千的页面都没被禁,电脑客户端......)

 由于这种方法效率比较低,我大概要爬取300个句子,就要访问330个页面,速度慢,开了多线程,保存本地,加了个锁(学了操作系统还是有用的,哈哈)。还是怕被封,所以把所有的状态码都显示了,以防万一!

接下来上所有代码:

# -*- conding:utf-8 -*-
"""
@author:ym
@time:05-2019/5/3-
"""
import threading
import time

import requests
import re
count = 0
flag = 0


def write_txt(msg):

    with open('C:\\****\***\Desktop\\好句子.txt', 'a+', encoding='UTF-8') as f:
        f.write(msg)


def get_the_title(num):
    # 获得id号 然后通过手机浏览器模拟,反爬你个蛇皮,搞的我乌烟瘴气的。
    global count
    count += 1
    url = "https://m.juzimi.com/ju/" + str(num)
    headers = {
        "user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) "
                      "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Mobile Safari/537.36",
    }
    html = requests.get(url=url, headers=headers)
    print("\n"+str(num)+"状态码:"+str(html.status_code), end='')
    html = html.content.decode('UTF-8')  # 解码
    msg = re.findall(r'content="句子欣赏评论:.*?\"', str(html))
    msg = str(msg).replace("content=\"句子欣赏评论:", '').replace("\"", '').\
        replace("[' “", '').replace("”']", '').replace("[' ", '').replace("']", '')
    msg += '\n'
    return msg


def get_good_night(page):
    """
    获取该页面的所有链接》》id,然后根据get_the_title 获取具体内容
    一定要用手机浏览器的格式,不然会被反爬(正常抓取,显示不全,还是没想到办法解决..)
    :param page:  当前的页面
    :return: 该页面爬取到的信息
    """
    # 一共有30页 》》0-29 ,0则不写
    global flag  # 并发情况 加锁
    flag += 1
    url = "https://www.juzimi.com/original/week/?page="+str(page)
    headers = {
        "user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) "
                      "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Mobile Safari/537.36",
    }
    html = requests.get(url=url, headers=headers)
    print(str(page)+"页状态:"+str(html.status_code), )
    html = html.content.decode('UTF-8')
    msg = re.findall(r"/user/login\?destination=ju/.*?&me=flag\"", html)
    message = ''
    for i in msg:
        i = str(i).replace("/user/login?destination=ju/", '').replace("&me=flag\"", '')
        message += get_the_title(i)
    flag -= 1
    return message


def add_speed(begin, end):
    i = begin
    msg = ''
    while i <= end:
        msg += get_good_night(i)
        i = i + 1
    write_txt(msg)


if __name__ == '__main__':
    threading.Thread(target=add_speed, args=(0, 5)).start()
    threading.Thread(target=add_speed, args=(6, 15)).start()
    threading.Thread(target=add_speed, args=(16, 30)).start()
    while flag:
        time.sleep(1)
    print('一共爬取好句子:'+str(count))
    print("ok\n")

nice!

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值