====== python-爬虫技能升级记录 ======

===== (一)感知爬虫及爬取流程 =====
<code>
从简单存取一个页面到 爬取到大量的定量数据,对技术要求更高,以百度百科数据爬取为入门练手项目.历时一个月,经历很多问题.

爬取流程:分析目标网页、得到url、拿url抓取、解析抓到的页面、存取数据和解析出的url、去重 继续迭代抓。

通过扩大关键词范围、从页面提取更多相关url源来覆盖更多可抓页,提升抓取数据量。
chrome浏览器F12是个好工具,把网页解析过程看的一目了然。
练好正则表达式,用好用熟python的各个爬虫工具库。
爬虫这个活,很锻炼分析he提取信息能力。

提高抓取速度,速度,速度.

</code>
===== (二)那些问题 =====

<code>
2.1 沟通上的问题:爬和存最终是要百度百科某个词条的完整页面,我误以为是要进一步析取页面某个部分的结果,浪费了点时间去练没用到的正则表达式;
2.2 爬取过程中发现问题的能力:
    爬取的前2天,数据从大量快速增长 到突然降到很小,爬取很突然变慢,结果是缺数据库索引 数据查询操作变慢拖累了爬取速度,
    --------> 需要随时观察数据量变化及时把握住趋势 提早解决问题;

每天评估抓取速度he目标数据量差距,提前开源--找新的关键词或者新的抓取方式抓取源头;

2.3 爬虫背景知识欠缺:http_status, 200 301,302,代理,并发

2.4 数据上的问题
   1) 遇到多义词的特殊页面 : https://baike.baidu.com/item/%E6%88%BF%E4%BA%A7 ;
   2) 拼接关键词错误 : https://baike.baidu.com/item/https://baike.baidu.com/error.html ;
   3) 不存在的页面处理问题: https://baike.baidu.com/error.html
   
</code>

==== [0001] url解析问题 ====结果

<code>
抓数据过程中,要从抓来的网页内容 提取url和所需关键字 ,用 urllib.parse.urlparse提取 路径,urllib.parse.unquote解码
比如 提取到url https://baike.baidu.com/item/%E5%86%8D%E7%94%9F%E4%B9%8B%E7%8E%8B%E6%9C%9D --> /item/再生之王朝

</code>

==== [0002] mysql crash了 ====
<code>
[问题]:数据 20G时,db crash,200w的数据 int类型的字段上 index 重建 花了 1.5小时,追查无果
[解决]:是内存耗尽,导致mysql的数据库索引文件损坏。
mysql修复命令:
myisamchk  --force --update-state --sort_buffer_size=2G  /data/mysql/data/baidu/baidu_baike
</code>
==== [0003] 302是啥?allow_redirects的作用 ====

<code>
302是一种重定向状态码,表明,要取得最终结果需要进一步请求.

301   (永久移动)  请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302   (临时移动)  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303   (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304   (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
305   (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
307   (临时重定向)  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

url = 'https://pan.baidu.com/s/1c0rjnbi'
tml = requests.get(url, headers=headers, allow_redirects=False)
return html.headers['Location']
allow_redirects=False的意义为拒绝默认的301/302重定向从而可以通过html.headers[‘Location’]拿到重定向的URL

https://baike.baidu.com/view/38072.html
urllib.error.HTTPError: HTTP Error 302: The HTTP server returned a redirect error that would lead to an infinite loop

</code>

==== [0004] 多thread的段错误问题 ====

起多个抓取thread ,运行一段时间报段错误 抓取程序崩溃--> mysql-connector.x86_64的包问题,换 mysql-connector_2.1.4 或者 pymysql后解决。

<code>[115686.825855] python3.5[112899]: segfault at 50 ip 00007f506bc70ba1 sp 00007f506a823f40 error 4 in _mysql_connector.cpython-35m-x86_64-linux-gnu.so[7f506bc1a000+3b9000]
[116821.355924] python3.5[122287]: segfault at 50 ip 00007fb8aedfeba1 sp 00007fb8ad9b1f40 error 4 in _mysql_connector.cpython-35m-x86_64-linux-gnu.so[7fb8aeda8000+3b9000]
[117432.277293] python3.5[124563]: segfault at 50 ip 00007f3e80cebba1 sp 00007f3e7f89ef40 error 4 in _mysql_connector.cpython-35m-x86_64-linux-gnu.so[7f3e80c95000+3b9000]
[117682.160350] python3.5[129646]: segfault at 50 ip 00007feea0327ba1 sp 00007fee9ef1af40 error 4 in _mysql_connector.cpython-35m-x86_64-linux-gnu.so[7feea02d1000+3b9000]
[117891.158342] python3.5[633]: segfault at 50 ip 00007ff5d0581ba1 sp 00007ff5cf174f40 error 4 in _mysql_connector.cpython-35m-x86_64-linux-gnu.so[7ff5d052b000+3b9000]
</code>

==== [0005] XHR是啥? ====
XMLHttpRequest,动态异步请求。
[[https://www.cnblogs.com/syfwhu/p/6116323.html| XHR简介 ]]
[[https://blog.csdn.net/zhiruchen/article/details/50983371|观察数据-分析-构造请求-结果]]
[[https://blog.csdn.net/zwq912318834/article/details/78364710|XHR-寻找参数来源]]

[[https://blog.jamespan.me/2016/02/28/mysql-select-from-update|mysql-select-from-update]]

==== [0006] 遇到cookie了 ====

<code>
url = "https://baike.baidu.com/wikiui/api/getcertifyinfo?lemma={0}".format("%E5%8C%97%E4%BA%AC%E5%85%AB%E5%8F%8B%E7%A7%91%E6%8A%80%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8")
    headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8',
            'X-Requested-With': 'XMLHttpRequest',
        }
    
    session = requests.Session()
    respn = session.post(url, verify = False, headers = headers, allow_redirects=False)

# https://baike.qixin.com/?eid=ea2b58fa-0b3f-440c-9076-d8735fdcc882&token=6018b5609a2c2ccf4cb8e4915ffcc4a7
    sec_url = eval(respn.text)['data']['iframe'].replace('\/','/')
    print('--sec_url--:' , sec_url)

cookie_jar = RequestsCookieJar()
    cookie = respn.cookies.get_dict()
    for k, v in cookie.items():
        cookie_jar.set(k, v, domain="baidu.com")
    print('cookie---', cookie, '\n--',str(cookie_jar))

rtext2 = session.post(sec_url, verify = False, headers = headers, cookies=cookie_jar, allow_redirects=False).text

print('rtext2--:\n' , rtext2)
</code>

[[https://blog.csdn.net/hpulfc/article/details/80084398| python--获取和设置cookie]]

==== [0007] 再探requests库 ====

python的变量引用原理, requests的post和get, requests的session的文档和用途;

==== [0098] 爬取速度可能慢的因素 ====

1. 多线程处理到同样任务,造成浪费;

2. 涉及到db操作的, 抓取队列长度和 db队列处理长度的最佳匹配;

==== [0099] 爬虫的调试 ====
<code>
 python的开发技能上:

1. 一定要了解整个抓取处理的流程;
2. 每个流程的环节打日志看消耗的时长;
3. 对目标数据量和程序的处理能力有清晰的感知;
4. 别瞎猜, 打日志看.

Linux系统有关:
 1. 段错误出现后及时看dmesg ,能看到是mysql连接器的包报出异常;

</code>
===== (三)欠缺之处和待提升的技能 =====
欠缺之处:

梳理问题能力要锻炼he提升, 进入状态慢,在开发进度把控上欠缺节奏感。

爬虫技术待提升技能:
并发, 异步, cookie,登录,验证码

----

[[https://github.com/davisking/dlib/issues/1104|段错误-参考资料 (the most important rule when writing multithreaded applications is that you can't have two threads modifying the same thing at the same time)]]

python-爬虫技能升级记录的更多相关文章

  1. 【Python】【爬虫】如何学习Python爬虫?

    如何学习Python爬虫[入门篇]? 路人甲 1 年前 想写这么一篇文章,但是知乎社区爬虫大神很多,光是整理他们的答案就够我这篇文章的内容了.对于我个人来说我更喜欢那种非常实用的教程,这种教程对于想直 ...

  2. Python爬虫与数据分析之爬虫技能:urlib库、xpath选择器、正则表达式

    专栏目录: Python爬虫与数据分析之python教学视频.python源码分享,python Python爬虫与数据分析之基础教程:Python的语法.字典.元组.列表 Python爬虫与数据分析 ...

  3. python爬虫工程师各个阶段需要掌握的技能和知识介绍

    本文主要介绍,想做一个python爬虫工程师,或者也可以说是,如何从零开始,从初级到高级,一步一步,需要掌握哪些知识和技能. 初级爬虫工程师: Web前端的知识:HTML, CSS, JavaScri ...

  4. Python爬虫个人记录(三)爬取妹子图

    这此教程可能会比较简洁,具体细节可参考我的第一篇教程: Python爬虫个人记录(一)豆瓣250 Python爬虫个人记录(二)fishc爬虫 一.目的分析 获取煎蛋妹子图并下载 http://jan ...

  5. Python爬虫个人记录(二) 获取fishc 课件下载链接

    参考: Python爬虫个人记录(一)豆瓣250 (2017.9.6更新,通过cookie模拟登陆方法,已成功实现下载文件功能!!) 一.目的分析 获取http://bbs.fishc.com/for ...

  6. Python爬虫之记录一次下载验证码的尝试

      好久没有写过爬虫的文章了,今天在尝试着做验证码相关的研究时,遇到了验证码的收集问题.   一般,验证码的加载都有着比较复杂的算法和加密在里边,但是笔者今天碰到的验证码却比较幸运,有迹可循.在此,给 ...

  7. 2019应届生,用python爬虫记录自己求职经历,分享求职中的一些坑

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http ...

  8. [Python爬虫] 在Windows下安装PIP+Phantomjs+Selenium

    最近准备深入学习Python相关的爬虫知识了,如果说在使用Python爬取相对正规的网页使用"urllib2 + BeautifulSoup + 正则表达式"就能搞定的话:那么动态 ...

  9. 【Python爬虫】入门知识

    爬虫基本知识 这阵子需要用爬虫做点事情,于是系统的学习了一下python爬虫,觉得还挺有意思的,比我想象中的能干更多的事情,这里记录下学习的经历. 网上有关爬虫的资料特别多,写的都挺复杂的,我这里不打 ...

随机推荐

  1. 2015/9/22 Python基础(18):组合、派生和继承

    一个类被定义后,目标就是把它当成一个模块来使用,并把这些对象嵌入到你的代码中去,同其他数据类型及逻辑执行流混合使用.有两种方法可以在你的代码中利用类.第一种是组合,就是让不同的类混合并加入到其他类中, ...

  2. dotnet core 实践——日志组件Serilog

     前几天把基于quartz.net的部分项目代码移植到了dotnet core ,但是没增加日志功能,原因是没找到合适的组件. 今天终于找到了Serilog: https://github.com/s ...

  3. json属性名为什么要双引号?

    原因一: 更加规范,利于解析 原因二: 避免class等关键字引起的不兼容问题 原因三: 可能也是最隐晦的: var a = 00; var b = {00: 12}; a in b; --> ...

  4. [数据库中间件]将用户添加到DB2组授权

    1.将用户oracle添加到db2的用户组中,命令如下: usermod -a -G db2iam #将用户添加到组中并不改变当前所属组 注:以下与主题无关,只是列举一些关于用户的命令 id user ...

  5. 关于HttpWebRequest发生服务器协议冲突的解决办法

    WinForm下的app.config文件中添加: <system.net>    <settings>      <httpWebRequest useUnsafeHe ...

  6. MFC CListCtrl 将一个列表的选中项添加到另一个列表

    MFC CListCtrl 将一个列表的选中项添加到另一个列表, 用VC6.0实现: 简单记录一下自己的学习历程, 和大家分享,如果对你有用,我很高兴. 1.新建一个基于对话框的工程(Dialog-B ...

  7. L - Looking for Taste Gym - 101991L 二进制枚举/思维

    方法一:因为最多是10的六次方,所以可以直接枚举二进制上的每一位来得到最优结果. AC代码: #include<iostream> #include<stack> #inclu ...

  8. PHP对象1: 创建对象与 $this

    <?php class perl{ public $name; function __construct($name){ echo '一个对象造好了<br/>'; $this-> ...

  9. 离线部署ELK+kafka日志管理系统【转】

    转自 离线部署ELK+kafka日志管理系统 - xiaoxiaozhou - 51CTO技术博客http://xiaoxiaozhou.blog.51cto.com/4681537/1854684 ...

  10. pip安装使用详解【转】

    转自:pip安装使用详解 – 运维生存时间http://www.ttlsa.com/python/how-to-install-and-use-pip-ttlsa/ pip类似RedHat里面的yum ...