scrapy反爬中间件

这两天爬取京东商城的商品信息和评论,试过几种方案,后来采用了读取json接口的方式。不过这个方案有个问题,每一个商品调用几个json接口,IP很容易被封。我只用了两台ADSL VPS做了代理池,虽然没有测试,但是我知道会经常拨到重复的IP,做代理池时我只是针对拨的IP和上次IP比较,如果相同再次重播,并没有把它放到redis池里去重,主要因为机器太少,拨号浪费时间,每次拨号都有5-6秒损失。

且看IP被封的表现,就是弹出登录页面,页面response:

IP被封:window.location.href=’https://passport.jd.com/uc/login’

我的解决办法就是在中间件中针对这个做出判断,IP被封就从redis池里删除,这样不会耽误其他线程,不然很多线程都会失败。

开始测试时可能是我的IP池比较新,单机每秒可以获取10+商品信息,所以单机日进百万商品sku是没问题的。但是,用了几个小时后就不行了,表现就是被封的频率越来越大,最后从30秒拨号减到10秒拨号一次。实际上,如果IP池足够大,单机一天也能采集几百万,而且还是很普通的服务器。

python邮件提醒

python脚本邮件提醒实现简单监控

简单粗暴,直接上代码。email通知在某些应用中还是必需的,当然也可以微信推送。

# -*- coding: utf-8 -*-
import time
# from playsound import playsound
from datetime import datetime
import smtplib
from email.mime.text import MIMEText
from email.header import Header

class EmailClient(object):
    def __init__(self):
        """
        初始化邮件列表     
                 
        """
        self.to_list = ["receiver_email"]
    def notification(self, body, subj):
        sender = 'sender_email'  # 邮件发送人
        receiver = 'receiver_email'  # 邮件收件人
        subject = 'adslproxy error: ' + subj + ' ' + str(datetime.today())[:16]  # 主题
        smtpserver = 'smtp.163.com'  # 网易的STMP地址 默认端口号为25
        username = 'sender_email'  # 发送邮件的人
        password = EMAIPASS  # 非网易登录密码.网易在开通SMTP服务后会有个密码设置

        # 中文需参数‘utf-8',单字节字符不需要
        msg = MIMEText(body, 'plain', 'utf-8')
        msg['Subject'] = Header(subject, 'utf-8')  # 头部信息:标题
        msg['From'] = 'user<sender_email>'  # 头部信息:名称<发件人的地址>
        msg['To'] = ",".join(self.to_list)  # 头部信息:收件人地址
        m = True
        while m == True:
            try:        
                smtp = smtplib.SMTP_SSL('smtp.163.com', 465)
                smtp.login(username, password)
                smtp.sendmail(sender, receiver, msg.as_string())
                smtp.quit()
                print('success')
                m = False
            except smtplib.SMTPException as e:
                print('Error: ', e)
                time.sleep(25)

emailclient = EmailClient()
emailclient.notification('test email', 'proxy')

在其他程序中调用时直接Import这个类即可:
from adslproxy.sendemail import EmailClient
比如:
    try:
        emailclient = EmailClient()
        emailclient.notification('adslproxy started', 'ygg22457 adslproxy started')
        print('email test success')
    except Exception as e:
        print(e)

本来还想用下微信推送的,后来想想太容易被封号,算了吧。