精华内容
下载资源
问答
  • Crawler 爬虫

    2019-04-13 22:46:13
    爬虫总结--汇总贴 爬虫总结(五)-- 其他技巧 爬虫总结(四)-- 分布式爬虫 爬虫总结(三)-- cloud scrapy 爬虫总结(二)-- scrapy 爬虫总结(一)-- 爬虫基础 & python实现 ...
    展开全文
  • Python crawler 爬虫笔记+爬虫实战

    千次阅读 2018-12-19 21:48:28
    Python crawler 爬虫笔记前言《1》什么是爬虫《2》为什么要爬虫Urllib1.urllib.request.urlopen(1)get请求(2)post请求2.urllib.parse(1)urlparse(2)urlunparse(3)urlencode3.urllib.robotparse4.爬虫伪装(1)...

    Python crawler 爬虫笔记

    前言

    爬虫初学者简单笔记…持续更新中…
    根据讲义为网易云课堂上的北京图灵学院推出的Python全系列教程:https://study.163.com/course/courseMain.htm?courseId=1004987028

    什么是爬虫

    网络爬虫又称网络蜘蛛、网络蚂蚁、网络机器人等,可以自动化浏览网络中的信息,当然浏览信息的时候需要按照我们制定的规则进行,这些规则我们称之为网络爬虫算法。使用Python可以很方便地编写出爬虫程序,进行互联网信息的自动化检索。

    《Urllib》

    1.urllib.request.urlopen

     urllib.request.urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
            *, cafile=None, capath=None, cadefault=False, context=None) 
     #例子:rsp = request.urlopen("https://blog.csdn.net/qq_43310834")
    

    url:可以是一个string(即该网站的url),或者一个Request对象。
    data:bytes对象,传递给服务器的数据,或者为None。在post和get请求的时候会用到。data在使用前需要使用urllib.parse.urlencode()函数转换成流数据。
    timeout:设置多久时间反应超时

    (1)get请求

    利用参数给服务器传递信息,参数为dict,然后用parse编码,直接以链接形式访问,链接中包含了所有的参数

     data=
     {
    'name':'xxx',
     }
     url_value = parse.urlencode(data)
     newurl=url+data
     rsp = request.urlopen(newurl)
    

    (2)post请求

    向服务器传递参数使用,请求的url不带后面的参数

     data=
     {
    'name':'xxx',
     }
     url_value = parse.urlencode(data).encode
     headers = {
    'Content-Length':len(url_value)
     }
     request = request.Request(url, data = url_value, headers = headers)
     response = request.urlopen(request)
    

    Tips:get请求是从指定的资源请求数据,post方法是向指定的资源提交要处理的数据

    2.urllib.parse

    (1)urlparse

    分解url

    result = urllib.parse.urlparse('http://www.baidu.com')
    

    (2)urlunparse

    合成url

    data =['http','www.baidu.com','index.html','user','a=6','comment']
    url = urllib.parse.urlunparse(data)
    

    (3)urlencode

    将字典编程请求的参数

    data={
        'name':'xxx'
    }
    data = urllib.parse.urlencode(data)
    

    3.urllib.robotparse

    解析网站文件 robots.txt,它能告诉爬虫和搜索引擎哪些页面可以抓取,哪些不可以抓取

    4.Headers

    (1)UserAgent

    用户代理,简称UA, 属于heads的一部分,服务器通过UA来判断访问者身份

    req = request.Request(url)
    req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 6.2;          WOW64) AppleWebKit/537.36 (KHTML, like Gecko)      Chrome/27.0.1453.94 Safari/537.36")
        常用:
            1.Android
            Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19
            Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
            Mozilla/5.0 (Linux; U; Android 2.2; en-gb; GT-P1000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
            2.Firefox
            Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0
            Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0
            3.Google Chrome
            Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36
            Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19
            4.iOS
            Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3
            Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A101a Safari/419.3
    

    (2)PRoxyHandler处理(代理IP)

    在请求目标服务器之前,先去请求代理服务器,然后由代理服务器去请求目标服务器,代理服务器拿到目标服务器的数据后,返回给我们。

    1. 设置代理地址

    2. 创建ProxyHandler

    3. 创建Opener

    4. 安装Opener

    5. 代理服务器:
      www.xicidaili.com
      www.goubanjia.com

      proxy = {'http': '120.194.18.90:81' }
      proxy_handler = request.ProxyHandler(proxy)
      opener = request.build_opener(proxy_handler)
      request.install_opener( opener)
      

    (3)Cookie & Session

    Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制,而session可以理解为在服务器端的cookie。cookie在f12的profile中寻找。
    cookie的属性
    - name: 名称
    - value: 值
    - domain:可以访问此cookie的域名
    - path: 可以访问此cookie的页面路径
    - expires:过期时间
    - size: 大小
    - Http字段
    -
    区别:
    cookie数据存放在客户的浏览器上,session数据放在服务器上。
    cookie不安全
    session会保存在服务器上一定时间,会过期

    1.手动输入cookie

     url = "http://www.renren.com/965187997/profile"
    headers = {
        "Cookie": "anonymid=jfosp2p2-48i1hh; depovince=BJ; _r01_=1; jebe_key=f2e12094-303b-4171-900f-ed304e5a5ba1%7C7629e5c8e0f7f334244eb5436ef05a2c%7C1523070488659%7C1%7C1523070515670; wp_fold=0; jebecookies=a201c15f-9745-40fc-9d32-7112f8cf849f|||||; ick_login=cbfe66e0-743c-46a4-a956-7d692056361d; _de=420A8DC764CD1624FC7C8526DA9A3A25; p=db36f5ff987e7e58c901f6194a22b7007; first_login_flag=1; ln_uact=13119144223; ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif; t=1b2976196819d4a57127f5b87ac495f77; societyguester=1b2976196819d4a57127f5b87ac495f77; id=965187997; xnsid=61e9001d; __utma=151146938.742687335.1523070758.1523070758.1523070758.1; __utmc=151146938; __utmz=151146938.1523070758.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=151146938.1.10.1523070758; ver=7.0; loginfrom=null; JSESSIONID=abcIxsy_d_tR06bwXfEkw; _urm_965187997=21"
    }
    req = request.Request(url, headers=headers)
    

    2.自动使用cookie

    (1)打开登录页面后自动通过用户名密码登录
    cookie = cookiejar.CookieJar()
    cookie_handler = request.HTTPCookieProcessor(cookie)
    http_handler = request.HTTPHandler()
    https_handler = request.HTTPSHandler()
    opener = request.build_opener(http_handler, https_handler,     cookie_handler)
    def login():
    
    url = "http://www.renren.com/PLogin.do"
    data = {
        "email": "13119144223",
        "password": "123456"
    }
    data = parse.urlencode(data)
    req = request.Request(url, data=data.encode())
    rsp = opener.open(req)
    
    (2)自动提取反馈回来的cookie
    url = "http://www.renren.com/965187997/profile"
    
    # 如果已经执行了login函数,则opener自动已经包含相应的cookie值
    rsp = opener.open(url)
    
    (3)利用提取的cookie登录隐私页面
    (4)cookie的保存
    filename = "cookie.txt"
    cookie = cookiejar.MozillaCookieJar(filename)
    cookie.save(ignore_discard=True, ignore_expires=True)
    
    (5)cookie的读取
    cookie = cookiejar.MozillaCookieJar()
    cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
    

    (4)SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。

    ssl._create_default_https_context = ssl._create_unverified_context
    

    (5)JS加密

    在爬虫爬取网站的时候,经常遇到一些反爬虫技术,比如:
    经过加密传输的就是密文,但是加密函数或者过程一定是在浏览器完成, 也就是一定会把js代码暴露给使用者通过阅读加密算法,就可以模拟出加密过程,从而达到破解
    例如有道在线翻译
    1.打开【有道在线翻译】网页:http://fanyi.youdao.com/
    2.【右键检查】,选中【Network】
    3.【输入单词】
    4.在请求中,找到关于翻译内容的Form Data,可以看到有下面两项说明js加密

    “salt”: “1523100789519”, 
    “sign”: “b8a55a436686cd8973fa46514ccedbe”,
    

    (1)手动

    爬取有道翻译的时候去除url中的_o,每个不同的单词的salt和sigh都会变化
    url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
    data = {
    Form Data中的代码
    }
    headers={
    Request Headers中的代码
    }
    

    (2)靠js代码自动

    alt公式是:  "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10));
        把他翻译成python代码
        salt = int(time.time()*1000) + random.randint(0,10)
        
        def getMD5(v):
        import hashlib
        md5 = hashlib.md5()
        md5.update(v.encode("utf-8"))
        sign = md5.hexdigest()
        return sign
        
        sign = 'fanyideskweb'+ key + str(salt) + "ebSeFb%=XZ%T[KZ)c(sy!"
        sign = getMD5(sign)
        通过构造sigh和salt来自动解密
        data中的   “i":key  
                   "salt": str(salt) 
                   "sign": getSign(key, salt)
    

    (6)Ajax

    Ajax,全称为Asynchronous JavaScript and XML,即异步的JavaScript和XML。这是一种利用JS在保证页面不被刷新、页面链接不变的情况下与服务器交换数据并更新部分网页的技术。
    返回一般为json

    5.Error情况

    1.URLError

    出现情况:本地网络未连接、服务器不存在、连接不到特点的服务器

    url = "http://www.wooooooooooooooooow.com"
    try:
        req = request.Request(url)
        rsp = request.urlopen(req)
        html = rsp.read().decode()
    except error.URLError as e:
        quit()
    

    2.HTTPError

    HTTPError是URLError的子类
    出现情况:利用urlopen方法发出一个请求时,服务器上都对应一个应答对象,其中包含一个数字(状态码),若urlopen不能处理,urlopen会产生一个相应的HTTPError对应相应的状态码,HTTP状态码表示HTTP协议所返回的响应的状态码

    url = "http://www.douban.com/w_linuxsaidfefefe"
    try:
        req = request.Request(url)
        rsp = request.urlopen( req )
        html = rsp.read().decode()
    except error.HTTPError as e:
        quit()
    

    《Requests》

    中文文档: http://docs.python-requests.org/zh_CN/latest/index.html
    开源地址: https://github.com/requests/requests
    File-Settings-Project interpreter中添加

    1.Data

    (1)Get请求

    Get得到class 'requests.models.Response’类型
    .content成为bytes类型

    rsp = requests.get(url, params=kw, headers=headers )
    params跟Urllib的data同理,不要即为None
    

    (2)Post请求

    rsp = requests.post(url, data=data,json=None,**kwargs,headers=headers)
    

    Tips:不需要转码

    2.Headers

    (1)Proxy

    proxies = {
           #用户代理验证:用户名:密码@代理地址:端口地址
           "http": "china:123456@192.168.1.123:4444"
            "https": "address of proxy"
            }
    auth=("test1", "123456")#授权信息
    #web客户端验证:auth=(用户名,密码)            
            rsp = requests.request("get", url,auth=auth,proxies=proxies)
    

    (2)Cookie

     rsp = requests.get("http://xxxxxxxxxxx")
              # 如果对方服务器给传送过来cookie信息,则可以通过反馈的cookie属性得到
              # 返回一个cookiejar实例
              cookiejar = rsp.cookies           
              #可以讲cookiejar转换成字典
              cookiedict = requests.utils.dict_from_cookiejar(cookiejar) 
    

    (3)Session

    模拟一次会话,从客户端浏览器链接服务器开始,到客户端浏览器断开
    创建session对象,可以保持cookie值

    ss = requests.session()            
    headers = {"User-Agetn":"xxxxxxxxxxxxxxxxxx"}
    data = {"name":"xxxxxxxxxxx"}
    # 此时,由创建的session管理请求,负责发出请求,
    ss.post("http://www.baidu.com", data=data, headers=headers)
    rsp = ss.get("xxxxxxxxxxxx")    
    

    (4)Https

    rsp = requests.get("https://www.baidu.com", verify=False)
    #参数verify负责表示是否需要验证ssL证书,默认是True
    

    《lxml》

    lxml是 Python 处理 xml 文档的一个库,是HTML/XML的解析器,速度快,易编程。
    官方文档: http://lxml.de/index.html

    1.etree

    (1)Element类

    1.创建节点

    root = etree.Element('root')
    

    2.获取节点名称

    print(root.tag)
    

    3.输出节点内容

    print(etree.tostring(root))
    

    4.添加子节点

    child = etree.SubElement(root, 'child')
    

    5.删除子节点

    root.remove(child1)
    

    (2)HTML解析

    利用etree.HTML或者etree.XML把字符串解析成HTML文档或者XML文档

    text = '''
    <div>
        <ul>
            <li class="item-0"> <a href="0.html"> first item </a></li>
            <li class="item-1"> <a href="1.html"> first item </a></li>
            <li class="item-2"> <a href="2.html"> first item </a>
        </ul>
    </div>
    '''
    html = etree.HTML(text)
    s = etree.tostring(html)
    

    (3)读取XML

    利用etree.parse读取xml文件

    html = etree.parse("xxx.xml")
    rst = etree.tostring(html, pretty_print=True)
    

    《BeautifulSoup4》

    python中BeautifulSoup4库的基础应用,网页数据挖掘的常用库之一。也就是说最主要的功能是从网页抓取数据。
    中文文档:http://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/

    1.创建对象

    用BeautifulSoup(html)方式创建

    url = 'http://www.baidu.com'
    rsp = request.urlopen(url)
    content = rsp.read()
    rsp = requests.get(url)
    content = rsp.content
    soup = BeautifulSoup(content, 'lxml')
    content = soup.prettify()
    

    2.四大对象种类

    (1)Tag

    Tag 是什么?通俗点讲就是 HTML 中的一个个标签

    1.name

    即为标签本身的名称

    <xxx href="what the"/>
    print(soup.xxx.name)
    #输出为xxx
    

    2.attrs

    得到一个所有属性的字典

    <xxx href="what the"/>
    print(soup.xxx.attrs)
    #输出为{"href":what the"}
    

    (2)NavigableString

    得到标签内部的文字

    <xxx>我的乖乖</xxx>
    print(soup.xxx.string)
    #输出为我的乖乖
    

    (3)BeautifulSoup

    BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象

    (4)Comment

    Comment 对象是一个特殊类型的 NavigableString 对象,一个输出不包含注释符号的对象

    3.搜索文档对象

    (1)子节点

    1. contents

    tag的子节点以列表的方式给出

    soup.head.contents 
    #[<title>百度一下,你就知道</title>,'\n'.......]
    

    2.children

    子节点以迭代器形式返回

    soup.head.children
    <list_iterator object at 0x0000017C53EC1FD0>
    

    (2)孙节点

    descendants 属性可以对所有tag的子孙节点进行递归循环,和 children类似,我们也需要遍历获取其中的内容。

    for child in soup.descendants:
        print child
    

    (3)父节点

    soup.head.parent.name
    

    4.遍历文档树

    (1)find_all()

    find_all(self, name=None, attrs={}, recursive=True, text=None,
    limit=None, **kwargs)
    方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件

    1.name参数

    字符串

    soup.find_all('head')
    

    正则表达式

    soup.find_all(re.compile('^me')
    

    列表

    print(soup.find_all(["title", "meta"]))
    

    True

    True 可以匹配任何值,下面代码查找到所有的tag,但是不会返回字符串节点
    soup.find_all(True)
    

    2.keyword

    可以用来表示属性,特殊的属性

    tags = soup.find_all(re.compile('^me'),content="always")
    

    3.text

    通过 text 参数可以搜搜文档中的字符串内容

    soup.find_all(text="Elsie")
    

    4.limit

    限制返回结果的数量

    5.recursive

    调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False

    (2)find()

    find(self, name=None, attrs={}, recursive=True, text=None
    同find_all

    5.CSS选择器

    (1)通过标签名查找

    print soup.select('title') 
    #[<title>百度一下,你就知道</title>]
    

    (2)通过类名查找

    titles = soup.select(".c-tips-container")
    #[<div class="c-tips-container" id="c-tips-container"></div>]
    

    (3)通过 id 名查找

    titles = soup.select("#c-tips-container")
    [<div class="c-tips-container" id="c-tips-container"></div>]
    

    (4)组合查找

    titles = soup.select("div #c-tips-container")
    #[<div class="c-tips-container" id="c-tips-container"></div>]
    

    (5)属性查找

    metas = soup.select("meta[name='referrer']")
    #[<meta content="always" name="referrer"/>]
    

    Tips:类名前加. id名前加 #

    《Selenium》

    selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。
    官网: http://selenium-python.readthedocs.io/index.html

    悼念PhantomJS…

    1.申明浏览器实例

    from selenium import webdriver
    driver = webdriver.Chrome()
    driver = webdriver.Firefox()
    driver = webdriver.PhantomJS()
    

    2.访问页面

    driver.get("http://www.baidu.com")
    

    3.查找元素

    (1)单个元素查找

    driver = webdriver.Chrome()
    url = "http://www.baidu.com"
    driver.get(url)
    text = driver.find_element_by_id('wrapper').text
    

    这里列举一下常用的查找元素方法:

    find_element_by_name
    find_element_by_id
    find_element_by_xpath
    find_element_by_link_text
    find_element_by_partial_link_text
    find_element_by_tag_name
    find_element_by_class_name
    find_element_by_css_selector

    (2)多个元素查找

    driver = webdriver.Chrome()
    url = "http://www.baidu.com"
    driver.get(url)
    text = driver.find_elements_by_css_selector('.service-bd li')
    

    同样的在单个元素中查找的方法在多个元素查找中同样存在:
    find_elements_by_name
    find_elements_by_id
    find_elements_by_xpath
    find_elements_by_link_text
    find_elements_by_partial_link_text
    find_elements_by_tag_name
    find_elements_by_class_name
    find_elements_by_css_selector

    4.元素交互操作

    (1)鼠标

    driver.get('https://www.baidu.com/')
    driver.find_element_by_id('kw').send_keys('selenium')
    driver.find_element_by_id('su').click()
    
    element = driver.find_element_by_name('tj_settingicon')#鼠标点击
    ActionChains(driver).click(element).perform() #单击某元素
    ActionChains(driver).click_and_hold(element).perform() #在此元素上按下左键不放
    ActionChains(driver).context_click(element).perform() #在此元素上单击右键
    ActionChains(driver).double_click(element).perform() #在此元素上双击
    
    ActionChains(driver).drag_and_drop(source,target).perform() #从一个元素的位置,拖至另一个元素位置松开
    

    (2)键盘

    from selenium.webdriver.common.keys import  Keys
    driver.find_element_by_id('kw').send_keys(u"大熊猫")
    driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'a')
    driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'x')
    driver.find_element_by_id('su').send_keys(Keys.RETURN)
    #其余的按键导入Keys后按ctrl查找
    

    (3)其他

    1.截屏

    driver.save_screenshot('hangmu.png')
    

    2.浏览器的前进与后退

    driver.back()
    driver.forward()
    

    《验证码》

    验证码官网 www.geetest.com
    OCR:OpticalChracterRecognition:光学文字识别
    Tesseract:OCR库
    通用方法:
    1.下载网页和验证码
    2.手动输入验证号码
    分类:
    1.输入式验证码
    2.滑动式验证码
    3.点击式的图文验证和图标选择
    4.宫格验证码

    《爬虫实战》

    1.下载今日头条组图

    (1)分析

    在这里插入图片描述
    进入首页,随便搜索个单词
    在这里插入图片描述
    由F12中发现页面url不变的情况下network内容不断增加,判断是Ajax
    在这里插入图片描述
    在这里插入图片描述
    继续在详情页的data里面寻找到image

    (2)上代码

    获取搜索的页面,由Headers里面寻找
    在这里插入图片描述
    在这里插入图片描述

    def get_page(offset,keyword):
        params={
            'offset': offset,
            'format': 'json',
            'keyword': keyword,
            'autoload': 'true',
            'count': '20',
            'cur_tab': '1',
            'from': 'search_tab',
            'pd': 'synthesis'
        }
        url="https://www.toutiao.com/search_content/?"+urlencode(params)
        response=requests.get(url)
        if(response.status_code==200):
            return response.json()
    

    由页面返回的json获取数据,由标题一步步索引到所要的image_list里image的url

    def get_images(json):
        data=json.get('data')
        if data:
            for item in data:
                image_list = item.get('image_list')
                title = item.get('title')
                if(image_list):
                    for image in image_list:
                        yield {
                            'image':image.get('url'),
                            'title':title
                        }
    

    将搜索到的图片和标题以文件夹和jpg的格式保存到本地

    def save(item):
        if not os.path.exists(item.get('title')):
            os.mkdir(item.get('title'))
        local_image_url=item.get('image')
        response=requests.get('http:'+local_image_url)
        if (response.status_code==200):
            file_path='{0}/{1}.{2}'.format(item.get('title'),md5(response.content).hexdigest(),'jpg')
            if not os.path.exists(file_path):
                with open(file_path,'wb') as f:
                    f.write(response.content)
    

    开始爬取

    def main(offset,keyword):
        json=get_page(offset,keyword)
        for item in get_images(json):
            print(item)
            save(item)
    if __name__ == '__main__':
        main(1,"爬虫")        
    

    2.刷CSDN阅读量(勿喷)

    (1)分析

    进入自己的博客,打开F12,先找到最基础的url,对应自己的账号
    在这里插入图片描述
    在这里插入图片描述
    在response中找到写过的文章的标题,确定他们的位置和特点
    在这里插入图片描述
    随便打开一篇自己写过的博客观察博客的url
    在这里插入图片描述
    在这里插入图片描述
    发现每篇文章的url跟data-articleid这个属性的值有关系,接下来就可以开工了

    (2)上代码

    做好headers的准备(此处我没用代理ip)

    user_list=[ 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19',
                'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'
                'Mozilla/5.0 (Linux; U; Android 2.2; en-gb; GT-P1000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1'
                'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0',
                'Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0'
                'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36',
                'Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19'
                'Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3',
                'Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A101a Safari/419.3'
                ]
    headers={
        'User-Agent':random.choice(user_list)
    }
    

    访问博客首页的url,一步步找到data-articleid这个数据,将数据和基础url拼接,然后进行最简单的get访问

    url='https://blog.csdn.net/qq_43310834'
    rsp = request.urlopen(url)
    content = rsp.read()
    soup = BeautifulSoup(content, 'lxml')
    titles=soup.select('div[class="article-item-box csdn-tracking-statistics"]')
    for item in titles:
        data=item.get('data-articleid')
        base_url='https://blog.csdn.net/qq_43310834/article/details/'
        target_url=base_url+data
        response = requests.get(target_url,headers=headers)
    

    出来就发现所有博客的阅读量++了,想刷其他博客的话就把每个含qq_43310834名字的换成相应博客的id就行了

    3.下载起点小说(VIP小说暂时无法下载)

    (1)分析

    进入起点全部作品,找到目录的的url,按照标题获取,对标题右键检查,找到对应的标题和文章的url
    在这里插入图片描述
    在这里插入图片描述
    进入文章的url后,用一样的方法检查它的文字位置
    在这里插入图片描述
    在这里插入图片描述

    (2)上代码

    获取文章url和文章标题,并且创造相应文件夹等待下载

    def start_request(self):
        response=requests.get("https://www.qidian.com/all")
        html=etree.HTML(response.content.decode())
        bigtit_list=html.xpath('//div[@class="book-mid-info"]/h4/a/text()')
        bigarc_list=html.xpath('//div[@class="book-mid-info"]/h4/a/@href')
        for Bigtit,Bigarc in zip(bigtit_list,bigarc_list):
            if (os.path.exists(Bigtit)==False):
                os.mkdir(Bigtit)
            self.file_data(Bigarc,Bigtit)
    

    进入每个小说的目录url,对每章进行遍历

    def file_data(self,bigarc,bigtit):
        response=requests.get("http:"+bigarc)
        html=etree.HTML(response.content.decode())
        littit_list = html.xpath('//ul[@class="cf"]/li/a/text()')
        litarc_list = html.xpath('//ul[@class="cf"]/li/a/@href')
        for littit,litarc in zip(littit_list,litarc_list):
            self.finally_file(littit,litarc,bigtit)
    

    将内容以txt形式保存

    def finally_file(self,tit,url,bigtit):
        response=requests.get("http:"+url)
        html=etree.HTML(response.content.decode())
        content="\n".join(html.xpath('//div[@class="read-content j_readContent"]/p/text()'))
        file_name=bigtit+"\\"+tit+".text"
        print("正在抓取文章"+file_name)
        with open(file_name,"a",encoding='utf-8') as f:
            f.write(content)
    

    启用爬虫

    spider=Spider()
    spider.start_request()
    
    展开全文
  • crawler 爬虫介绍

    2014-02-22 13:57:54
    crawler 爬虫 http://blog.csdn.net/ewili/article/details/8614002
    展开全文
  • Crawler爬虫总结

    千次阅读 2017-03-28 23:22:56
    Python, Crawler爬虫

    Crawler小爬虫,总结


    python数据类型

    • 字符串,单引号双引号-普通字符串,三引号-跨行长字符串
    str = 'this is string'
    str = "this is also a string"
    str = '''
            this is a long string
            which inclode many sustring
            and multiple lines
            '''
    • 列表,用中括号[]表示,可以加入各种数据类型的数据
        list = [1, 2 ,3, 4 ,5]
        multipleTypeList = ['123', 123, otherType]
    • 元组,定义好的元组中的不能够修改,但是可以用del删除,+连接,*复制元组,使用()表示
    tuple = (1, 2, 3, 4, 5)
    multipleTypeTuple = (1, 2, '123', otherType)
    • 字典,无序的对象集合,相当于其它语言中的map,关联数组或哈希表,又键和对应的值组成,通过键来取值,而且键必须是独一无二的
    dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
    multipleDic = {'1' : 1, '2' : '123'}
    #清空词典的所有条目
    dict.clear()
    #返回指定键的值,如果值不在字典中返回default值
    dic.get(key, default=None)
    #如果键在字典dict里返回true,否则返回false
    dict.has_key(key) 
    #以列表返回可遍历的(键, 值) 元组数组
    dict.items() 
    #以列表返回一个字典所有的键
    dict.keys() 
    #把字典dict2的键/值对更新到dict里
    dict.update(dict2) 
    #以列表返回字典中的所有值
    dict.values()
    • set集合
    set = set()
    set.add(data)
    #弹出最后一个数据并返回
    set.pop()
    • Queue,队列
    import Queue
    myqueue = Queue.Queue(maxsize = 10)
    myqueue.put(10)
    #从队头删除并返回一个项目
    myqueue.get()
    
    #python queue模块的FIFO队列先进先出。
    class Queue.Queue(maxsize) FIFO
    #LIFO类似于堆。即先进后出。
    class Queue.LifoQueue(maxsize) LIFO
    #还有一种是优先级队列级别越低越先出来。
    class Queue.PriorityQueue(maxsize) 优先级队列
    • 去掉所有的特殊字符串,使用正则表达式 re.sub[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()], 'replaceString', 'contentString'
    #-*-coding:utf-8-*-
    import re
    temp = "想做/ 兼_职/学生_/ 的 、加,我Q:  1 5.  8 0. !!??  8 6 。0.  2。 3     有,惊,喜,哦"
    temp = temp.decode("utf8")
    string = re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+".decode("utf8"), "".decode("utf8"),temp)
    print string # 想做兼职学生的加我Q158086023有惊喜哦
    
    • 对数据是否为None,字符串比较大小,相等==:
    type # 未定义的话会有NoneType的错误出现
    if type is None :
        pass
    
    string = ''
    if string == '':
        pass
    
    • 异常处理
    try:
        pass
    except Exception,e:
        e.args
        e.message
        str(e)
    • 编码问题
      • 对ascii和utf-8的编码装换,因为大多数都是使用utf-8字符,但是因为python默认编写时候就是用ascii来编写的,所以会出现乱码的问题
      • 写有中文字符的文件的时候,可以使用codecs指定编码写入
      • 在写入csv文件的时候需要指定csv文件为utf-8
    # Unicode编码
    string = u'中国人'
    #使用encode可以对Unicode进行解码
    string.encode('utf-8')
    #使用decode可以将编码变成Unicode的编码
    string.decode('utf-8')
    
    #需要注意的一个问题是在使用list,set,dic这种数据类型的时候,因为函数调用了__repr__(),
    #所以直接用pring输出的话,即使原来就是Unicode编码,
    #打印的时候,也只会出现Unicode,在终端上无法显示出对应的中文
    #如果想要显示的话,需要将list,set循环遍历,dic取出键值打印才能够正确
    
    
    # 普通文件写入utf-8编码
     writeFile = codecs.open(fileName, 'w', "utf-8")
     writeFile.write(content)
     writeFile.close()
    
     # 写入csv文件
     f = open(fileName, 'w')
     #设置编码为utf8
     f.write(codecs.BOM_UTF8)
     #写一行
     f.writerow(content)
     #写多行
     f.writerows(content)
    
     f.close()
    
    展开全文
  • PHPCrawl webcrawler 爬虫

    2019-08-02 11:35:04
    NULL 博文链接:https://justcoding.iteye.com/blog/1969495
  • node.js爬虫模块爬取王者荣耀所有英雄信息 一、准备工作 ... 你会看到所有的英雄,打开F12开发者模式 打开network, 下面找XHR,刷新下网页, 下面会出现一个herolist.json的文件. ...安装crawler爬虫模块:npm
  • node-crawler爬虫实践

    2020-08-12 13:04:12
    cnpm i axios crawler 代码 function decode(str) { // 一般可以先转换为标准 unicode 格式(有需要就添加:当返回的数据呈现太多\\\u 之类的时) str = unescape(str.replace(/\\u/g, "%u")); // 再对实体符...
  • 由于python更新,有些API用法有变,原程序已经不能在新版本中正常运行了。经过本人改进测试,此crawler项目能正常运行。 测试平台: win7 python3.7
  • 爬虫跟静态服务器搭建 爬取之前要做的事: 首先下载npm的一个模块 命令:npm i crawler 下载完你会得到一个名字是node_modules文件夹跟一个package-lock.json文件 注意: 使用第三方模块: 新建一个文件夹,...
  • 今天我们来写一下基于gecco的爬虫例子。 当然还是以京东页面为例,链接:https://www.jd.com。 首先我们主要需要gecco包:    com.geccocrawler  gecco  1.2.8 好了,我们来不如正题吧! 先创建一个类...
  • Course Crawler是一个开源项目,这个可以爬取一些学习视频,比如我最近在看Java,就爬了 一些Java的学习视频; 这世上没有无缘无故的爱憎。。。我写这个文档的原因是…之前把这个爬虫工具介绍给了一个 小伙伴,我说...
  • Node.js爬取妹子图-crawler爬虫的使用

    千次阅读 2018-04-04 10:35:16
    后来在网上看见了crawler,昨天就把crawler把玩了了一把。感觉使用起来还可以,他的作用和上面的两个包的作用是一样的。 这次我爬取的是妹子图。 在爬取之前,还是建议先看看crawler怎么使用。其实它的是有还是...
  • Crawler爬虫实例:huawei appstore

    千次阅读 2016-01-09 17:40:38
    1. create a scrapy project >>> scrapy startproject appstore 2. define extracted data schema edit appstore/appstore/items.py, add the following: import scrapy class AppstoreItem(scrapy.Item):

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,178
精华内容 871
关键字:

crawler爬虫

爬虫 订阅