netcrawler ---- python 网络爬虫
文章目录
名词集锦
课程简介
- urllib
- 正则
网络资源
教程
- https://cuiqingcai.com/4320.html 静觅,崔庆才的博客
- https://www.jianshu.com/p/2e190438bd9c python3 urllib
urllib.request 模块
urllib.request.Request
高级方法
Handler 与 OpenerDirector
关系
- OpenerDirector 就是 Opener
- opener 来自 build_opener(opener)
- 自定义 opener:install_opener(opener)方法
得到全局的 OpenerDirector 对象
urllib.request.BaseHandler 基类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17import urllib.request url = "http://tieba.baidu.com/" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36' } proxy_handler = urllib.request.ProxyHandler({ 'http': 'web-proxy.oa.com:8080', 'https': 'web-proxy.oa.com:8080' }) opener = urllib.request.build_opener(proxy_handler) urllib.request.install_opener(opener) request = urllib.request.Request(url=url, headers=headers) response = urllib.request.urlopen(request) print(response.read().decode('utf-8'))- 注意:此处使用 opener.open(url)代替了 urllib.request.urlopen(url)方法。
urllib.error 模块
urllib.error.URLError 与 urllib.error.HTTPError
- HTTPErro 是 URLError 的子类
URLError 只有一个属性 reason
HTTPError 三个属性,reason,code, headers(HTTP 请求返回的响应头信息)
http.cookiejar 模块
用于爬虫的 cookie 处理
- 在 python2 中名称为:cookielib
正则表达式
- 边界匹配 https://cuiqingcai.com/977.html
- "\b": between words 匹配\w 与\W 之间
python emacs 环境
scrapy 架构
scrapy shell
xpath 选择器
- response.xpath()
- response.css()
测试工具
- Katalon Studio tutorial: https://docs.katalon.com/katalon-studio/tutorials/introduction-to-web-testing.html#before-you-begin
xpath 插件
- xpath helper
- xpath helper wizard
sina news https://finance.sina.com.cn/stock/hkstock/ggscyd/2019-03-18/doc-ihrfqzkc4719941.shtml
xpath items
1 2 3 4 5 6 7 8* for content title //title/text() keywords //div[@class='keywords']//a/text() date //div[@class='date-source']/span[@class='date']/text() source //div[@class='date-source']/a/text() * for link page url_L1
scrapy.loader.processors
- ItemLoader 处理
包含函数,Join(),MapCompose()
- 见《Learn Scrapy》中文版,Page38
- MapCompose(): 返回的是一个类似函数的东西
Example:
1load.add_xpath('keywords', "//div[@class='keywords']//a/text()", MapCompose(str.strip), Join())关于 loader
1 2 3 4 5 6def parse(self,respond): load=ItemLoader(item=YourItems(), response=response) load.add_xpath('datefield','your xpath',MapCompose(str.strip,str.title), Join()) load.add_value('calculatedField', computeFunctions()...) return load.load_item()注:
- 对 python2,使用 unicode.strip, unicode.title
- 对 python3,使用 str.strip, str.title
scrapy.Request(link, callback=self.parse_next)
callback 的作用
- 把从 “link” 上面下载的数据,传给 callback 调用的函数 self.parse_next 来解析
- 即:用 self.parse_next <—– 解析 link
- python2 是直接 Request, 这是区别
python2 <—> python3
scrapy
| Python2 | Python3 | |
|---|---|---|
| Request | urllib.request.Request | 实际使用的是下面一个,scrapy.http.Request |
| urlparse.urljoin | urllib.parse.urljoin | |
| urlopen | urllib.request.urlopen | |
| Request | from scrapy.http import Request | Request(url=link,callback=self.parse) |
调试命令
- scrapyparse–spider=basichttp://web:9312/properties/property_000001.html
- scrapyshell –pdb https://gumtree.com
- scrapyshell-sUSER_AGENT="Mozilla/5.0"<yoururlheree.g.http://www.gumtree.com/p/studios-bedsits-rent/...>
- scrapycheckbasic
编程基本语句
- fromproperties.itemsimportPropertiesItem
TODO 学习内容
- pyquery
- Ajax
- pyside2
- scrapy 陈磊的 git 上的代码
- nrp
Pandas
- Numpy , 不紧要
- 数据库
- Katalon Studio
- 陈雷的 git
json
注意:
对于 python 中的 json 模块
- 内部的键要用双引号,不能使用单引号
eg:
1 2 3 4 5 6 7 8 9 10 11 12 13 14import json str=''' [{ "good":"yes", "name":"Bob" },{ "good":"no", "name":"Zhou Hang" } ] ''' data=json.loads(str)
pyquery
导入模块
- import pyquery as pq
构建 pyquery 对象
- str=‘a html or xml 格式字符串’
对象 doc
- doc=pq(html)
- doc=pq(filename=“”)
jQuery
注意:
jQuery在文档全部加载之后才能正确运行
- 所以有ready方法
| |
特别语法
| |
选择器
$("p").parentsUntil("div")
- 选择<p>与<div>之间的所有元素element,但是"不包括" <p>和<div>
$("h2").nextUntil("h6")
- 与上面的Until一个意思
- next sibling下一个同胞元素
$("p").children()
- 所有的第一级子元素
eg:
1 2 3$("div").children("p.1"); //相当于div>p.1 (css selector) //class=1 的紧挨着div的子元素
索引
eq
- $("p").eq(1);
- 返回第几个元素
注意:
- 以0开始索引
filter
- $("p").filter(".url")
not
- $("p").not(".url");
Selectors 选择器
http://www.runoob.com/jquery/jquery-ref-selectors.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57// * 基本选择器 $("#id") //ID选择器 $("div") //元素选择器 $(".classname") //类选择器 $(".classname,.classname1,#id1") //组合选择器 // * 层次选择器 $("#id>.classname ") //子元素选择器 $("#id .classname ") //后代元素选择器 $("#id + .classname ") //紧邻下一个元素选择器 $("#id ~ .classname ") //兄弟元素选择器 // * 过滤选择器(重点) $("li:first") //第一个li $("li:last") //最后一个li $("li:even") //挑选下标为偶数的li $("li:odd") //挑选下标为奇数的li $("li:eq(4)") //下标等于 4 的li(第五个 li 元素) $("li:gt(2)") //下标大于 2 的li $("li:lt(2)") //下标小于 2 的li $("li:not(#runoob)") //挑选除 id="runoob" 以外的所有li // * 内容过滤选择器 $("div:contains('Runob')") // 包含 Runob文本的元素 $("td:empty") //不包含子元素或者文本的空元素 $("div:has(selector)") //含有选择器所匹配的元素 $("td:parent") //含有子元素或者文本的元素 // * 可见性过滤选择器 $("li:hidden") //匹配所有不可见元素,或type为hidden的元素 $("li:visible") //匹配所有可见元素 // * 属性过滤选择器 $("div[id]") //所有含有 id 属性的 div 元素 $("div[id='123']") // id属性值为123的div 元素 $("div[id!='123']") // id属性值不等于123的div 元素 $("div[id^='qq']") // id属性值以qq开头的div 元素 $("div[id$='zz']") // id属性值以zz结尾的div 元素 $("div[id*='bb']") // id属性值包含bb的div 元素 $("input[id][name$='man']") //多属性选过滤,同时满足两个属性的条件的元素 // * 状态过滤选择器 $("input:enabled") // 匹配可用的 input $("input:disabled") // 匹配不可用的 input $("input:checked") // 匹配选中的 input $("option:selected") // 匹配选中的 option // * 表单选择器 $(":input") //匹配所有 input, textarea, select 和 button 元素 $(":text") //所有的单行文本框,$(":text") 等价于$("[type=text]"),推荐使用$("input:text")效率更高,下同 $(":password") //所有密码框 $(":radio") //所有单选按钮 $(":checkbox") //所有复选框 $(":submit") //所有提交按钮 $(":reset") //所有重置按钮 $(":button") //所有button按钮 $(":file") //所有文件域基本选择器
1 2 3 4$("#id") //ID选择器 $("div") //元素选择器 $(".classname") //类选择器 $(".classname,.classname1,#id1") //组合选择器层次选择器
1 2 3 4$("#id>.classname ") //子元素选择器 $("#id .classname ") //后代元素选择器 $("#id + .classname ") //紧邻下一个元素选择器 $("#id ~ .classname ") //兄弟元素选择器过滤选择器(重点)
1 2 3 4 5 6 7 8$("li:first") //第一个li $("li:last") //最后一个li $("li:even") //挑选下标为偶数的li $("li:odd") //挑选下标为奇数的li $("li:eq(4)") //下标等于 4 的li(第五个 li 元素) $("li:gt(2)") //下标大于 2 的li $("li:lt(2)") //下标小于 2 的li $("li:not(#runoob)") //挑选除 id="runoob" 以外的所有li内容过滤选择器
1 2 3 4$("div:contains('Runob')") // 包含 Runob文本的元素 $("td:empty") //不包含子元素或者文本的空元素 $("div:has(selector)") //含有选择器所匹配的元素 $("td:parent") //含有子元素或者文本的元素可见性过滤选择器
1 2$("li:hidden") //匹配所有不可见元素,或type为hidden的元素 $("li:visible") //匹配所有可见元素属性过滤选择器
1 2 3 4 5 6 7$("div[id]") //所有含有 id 属性的 div 元素 $("div[id='123']") // id属性值为123的div 元素 $("div[id!='123']") // id属性值不等于123的div 元素 $("div[id^='qq']") // id属性值以qq开头的div 元素 $("div[id$='zz']") // id属性值以zz结尾的div 元素 $("div[id*='bb']") // id属性值包含bb的div 元素 $("input[id][name$='man']") //多属性选过滤,同时满足两个属性的条件的元素状态过滤选择器
1 2 3 4$("input:enabled") // 匹配可用的 input $("input:disabled") // 匹配不可用的 input $("input:checked") // 匹配选中的 input $("option:selected") // 匹配选中的 option
表单选择器
1 2 3 4 5 6 7 8 9$(":input") //匹配所有 input, textarea, select 和 button 元素 $(":text") //所有的单行文本框,$(":text") 等价于$("[type=text]"),推荐使用$("input:text")效率更高,下同 $(":password") //所有密码框 $(":radio") //所有单选按钮 $(":checkbox") //所有复选框 $(":submit") //所有提交按钮 $(":reset") //所有重置按钮 $(":button") //所有button按钮 $(":file") //所有文件域
文章作者
上次更新 2022-03-03 (5c64003)