爬虫知识点(session)

import requests
try:
    import cookielib                     ###可以把本地的cookie,生成到requests的cookie
except:
    import http.cookiejar as cookielib
import re
import time
import os.path
try:
    from PIL import Image
except:
    pass




# 构造 Request headers
uagent = 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36'
headers = {
    "Host": "www.zhihu.com",
    "Referer": "https://www.zhihu.com/",
    'User-Agent': agent
}


# 使用登录cookie信息
session = requests.session()                            ###实例一个session ,每次访问就不用requests,提高效率
session.cookies = cookielib.LWPCookieJar(filename='cookies')    实例的cookie可以调用save方法
try:
    session.cookies.load(ignore_discard=True)
except:
    print("Cookie 未能加载")




def get_xsrf():
    '''_xsrf 是一个动态变化的参数'''              _xsrf  账号 密码三者都全才能登陆
    index_url = 'https://www.zhihu.com'
    # 获取登录时需要用到的_xsrf
    index_page = session.get(index_url, headers=headers)#  ###session.get是requests高效率
    html = index_page.text
    pattern = r'name="_xsrf" value="(.*?)"'
    # 这里的_xsrf 返回的是一个list
    _xsrf = re.findall(pattern, html)
    return _xsrf[0]




# 获取验证码
def get_captcha():
    t = str(int(time.time() * 1000))
    captcha_url = 'https://www.zhihu.com/captcha.gif?r=' + t + "&type=login"
    r = session.get(captcha_url, headers=headers)
    with open('captcha.jpg', 'wb') as f:
        f.write(r.content)
        f.close()
    # 用pillow 的 Image 显示验证码
    # 如果没有安装 pillow 到源代码所在的目录去找到验证码然后手动输入
    try:
        im = Image.open('captcha.jpg')
        im.show()
        im.close()
    except:
        print(u'请到 %s 目录找到captcha.jpg 手动输入' % os.path.abspath('captcha.jpg'))
    captcha = input("please input the captcha\n>")
    return captcha




def isLogin():
    # 通过查看用户个人信息来判断是否已经登录
    url = "https://www.zhihu.com/settings/profile"  ###登陆状态才能查看的页面,302
    login_code = session.get(url, headers=headers, allow_redirects=False).status_code      ###设置为false,成功后不跳转到首页 而是那个开始登陆后才能看到的页面   ###状态码302还是200

    if login_code == 200:
        return True
    else:
        return False




def login(secret, account):
    _xsrf = get_xsrf()
    headers["X-Xsrftoken"] = _xsrf
    headers["X-Requested-With"] = "XMLHttpRequest"
    # 通过输入的用户名判断是否是手机号
    if re.match(r"^1\d{10}$", account):
        print("手机号登录 \n")
        post_url = 'https://www.zhihu.com/login/phone_num'
        postdata = {
            '_xsrf': _xsrf,
            'password': secret,
            'phone_num': account
        }
    else:
        if "@" in account:
            print("邮箱登录 \n")
        else:
            print("你的账号输入有问题,请重新登录")
            return 0
        post_url = 'https://www.zhihu.com/login/email'
        postdata = {
            '_xsrf': _xsrf,
            'password': secret,
            'email': account
        }
    # 不需要验证码直接登录成功
    login_page = session.post(post_url, data=postdata, headers=headers)
    login_code = login_page.json()
    if login_code['r'] == 1:
        # 不输入验证码登录失败
        # 使用需要输入验证码的方式登录
        postdata["captcha"] = get_captcha()
        login_page = session.post(post_url, data=postdata, headers=headers)
        login_code = login_page.json()
        print(login_code['msg'])
    # 保存 cookies 到文件,
    # 下次可以使用 cookie 直接登录,不需要输入账号和密码
    session.cookies.save()


try:
    input = raw_input
except:
    pass




if __name__ == '__main__':
    if isLogin():
        print('您已经登录')
    else:
        account = input('请输入你的用户名\n>  ')
        secret = input("请输入你的密码\n>  ")
        login(secret, account)


selenium    
pip install selenium
谷歌浏览器安装driver


from selenium import webdriver
from scrapy.selector import Selector


browser = webdriver.Chrome(executable_path="D:/Temp/chromedriver.exe")


browser.get("https://www.zhihu.com/#signin")
time.sleep(14)   #为了解决brower没有get完,就去seletor
t_seletor=seletor(text=brower.page_o\soource)
e_seletor.css()或者用brower的函数
browser.find_element_by_css_selector(".view-signin input[name='account']").send_keys("18782902568")
browser.find_element_by_css_selector(".view-signin button.sign-button").click()
selenium 完成微博模拟登录
time.sleep(14)


for i in range(3):
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight); var lenOfPage=document.body.scrollHeight; return lenOfPage;")#####execute_scrip可以执行JavaScript的原生代码,下拉页面



#设置chromedriver不加载图片
# chrome_opt = webdriver.ChromeOptions()
# prefs = {"profile.managed_default_content_settings.images":2}
# chrome_opt.add_experimental_option("prefs", prefs)


其他爬虫知识点
将selenium,chromedriver  整合到middlewares
学习网站   github  stakoverflow
 chrome 在linux下无界面访问 pyvirtualdispaly
 # from pyvirtualdisplay import Display
# display = Display(visible=0, size=(800, 600))
# display.start()


scrapy  splash






#phantomjs, 无界面的浏览器, 多进程情况下phantomjs性能会下降很严重


browser = webdriver.PhantomJS(executable_path="E:/home/phantomjs-2.1.1-windows/bin/phantomjs.exe")
browser.get("https://detail.tmall.com/item.htm?spm=a230r.1.14.3.yYBVG6&id=538286972599&cm_id=140105335569ed55e27b&abbucket=15&sku_properties=10004:709990523;5919063:6536025")


print (browser.page_source)
browser.quit()








网页去重
在scheduler调度器里dupefilters.py
requests中fingerprint  方法去重的原理url  哈希成一个固定长度的值放n内存set里面




telnet:Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。
在程序与功能中打开   关闭与打开window 功能 ,打开Telnet两个 在打开cmder
Telnet localhost 6023
est()  查看spider进程远程监听


crawler Scrapy Crawler (scrapy.crawler.Crawler 对象)
engine Crawler.engine属性
spider 当前激活的爬虫(spider)
slot the engine slot
extensions 扩展管理器(manager) (Crawler.extensions属性)
stats 状态收集器 (Crawler.stats属性)
settings Scrapy设置(setting)对象 (Crawler.settings属性)
est 打印引擎状态的报告
prefs 针对内存调试 (参考调试内存溢出)
p pprint.pprint 函数的简写
hpy 针对内存调试 (参考 调试内存溢出)




数据收集器ststscollectors.py
  #收集伯乐在线所有404的url以及404页面数
    handle_httpstatus_list = [404]


def parse(self, response):
if response.status == 404:
            self.fail_urls.append(response.url)
            self.crawler.stats.inc_value("failed_url")




scrapy  signals
捕捉意向项目的信息  使用(extension)扩 暂停展完成scrapy的扩展


scrapy的开始开始与暂停
要暂停爬虫 需要文件保存临时状态信息
crawl spider lagou -s JOBDIR=job_info/001 设置保存临时文件的文件夹
重新设置一个新的文件夹  就会重新开始一个新的爬虫
kill-f -9 lagou.py 强制消除
ctrl c  
暂停后的开始命令crawl spider lagou -s JOBDIR=job_info/001跟刚开始的命令一样
分布式爬虫的优点
 1充分利用多机器的宽带加速爬取
 2充分利用多机器的ip加速爬取速度
 
 
 分布式爬虫需要解决的问题
 1requests 队列的集中管理 
 2去重集中管理
  需要更改的文件:


  
 步骤“
  1workon articlespider  #进入虚拟环境
  2 scrapy startproject scrapy _redis
  3pycharm 打开工程
  3下载scrapy_redis 源码 拷贝到新建的工程
  setting    ROBOTSTXT_OBET=false   不遵循robosttxt协议  scheduler dupefilters class  item_pipelines
 4cdmer  lpush baidu(spider)名字  :start_urls http://www.biadu.com 初始化
 5key* 查看Redis 所有状态
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值