爬虫要根据当前url地址对应的响应为准,当前url地址的elements的内容和url的响应不一样
页面上的数据在哪里
- 当前url地址对应的响应中
- 其他的url地址对应的响应中
- 比如ajax请求中
- js生成的
- 部分数据在响应中
- 全部通过js生产
requsets中解决编解码的方法
- response.content.decode()
- response.content.decode(“gbk”)
- response.text
requests.text 和requests.content的区别
- 使用request.text时候,需要制定解码方式,response.encoding=“utf8”,否则中文乱码。
- 使用requests.content时候,只需用requests.content.decode()一句话就可以了。
使用代理ip
-
准备一堆的ip地址,组成ip池,随机选择一个ip来使用
-
如何随机选择代理ip
- {“ip”:ip,“time”:0}
- [{},{},{},{},{}],对这个ip列表进行排序,按照使用次数进行排序
- 选择使用次数较少的10个ip,从中随机选择一个。
-
检测ip的可用性
- 可以使用requests添加超时参数,判断ip地址的质量
- 在线代理ip检测网站
requests小技巧
- requests.util.dict_from_cookiejar 把cookie对象转化为字典
urllib
- 下载图片文件
- urllib.requests.urlretrieve(img,‘路径’)
lxml库
-
导入lxml的etree库
- from lxml import etree
-
利用etree.HTML,将字符串转化为element对象
-
element对象具有xpath的方法
- html = etree.HTML(text)
xpath 学习重点
- 获取文本
- a/text()
- @符号
- a/@herf
- //ul[@id=""]
- //
- 在xpath开始的时候表示从当前html中任意位置开始选择
- li//a 表示的示li下任何一个标签
xpath 的包含
- //div[contains(@class,‘i’)]
BeautifulSoup
- find_all的使用
“”“python
a = soup.find_all(‘a’)#查询所有的a标签
“”” - select
- 通过标签名查找
- 通过类名选择,在类的前面加一个点
- 通过id名字选择 id前加#
- 查找子孙元素 那么要在子孙元素中间有一个空格
- 查找直接子元素,那么在父子元素中间有一个>
- 跟据属性名字进行查找
“”“python
input[name=‘username’]
“””
re
match
- 从头开始匹配
匹配单个字符
- "."匹配任意字符(换行符除外)
- "\d"匹配数字(0-9)
- "\D"匹配非数字
- "\s"匹配空白字符(\n \r \t 空格)
- "\w"匹配的是a-z,A-Z,数字和下划线
- “\W"匹配与”\w"相反
- “[]“组合的方式,只要满足中括号中的某一项都算匹配成功。
“”“python
text = “120-12455515”
ret = re.match(”[\d-]”,text)
ret.group() 1
“”” - “[]“中括号的形式代替”\d” [0-9]
- “[]“中括号的形式代理”\D” 中括号(^0-9)
- “[]“中括号的形式代替”\w” [a-zA-Z0-9_]
匹配多个字符
- "*"匹配0或者任意多个字符
- "+"匹配1个或者多个字符
- "?"匹配0个或者1个字符
- {m}匹配m个字符
- {m,n}匹配m-n个字符
group
- group()函数取所有“()用于分组”
- group(1)取第一个分组
groups
- 取所有的子分组
sub
- 替换匹配的字符串
search
- 返回第一个匹配的字符串
split
- 分割
findall
- 返回所有的符合规则的 以列表返回
re.S和re.DOTALL
- 可以让“.”匹配到"\n"
JSON学习(本质就是一个字符串)
json支持数据格式
- 对象(字典),使用花括号
- 数组(列表),使用方括号
- 整形、浮点型、布尔类型还有null类型
- 字符串类型(字符串必须要用双引号,不能用单引号)
csv的读取和写入
- 读取
- 写入
- 第一种方法
“”“python
import csv
headers = [‘name’,‘age’,‘height’]
values = [
(‘张三’,18,160),
(‘李四’,19,180),
(‘王五’,20,170)
]
with open(‘classroom.csv’,‘w’,encoding=‘utf-8’,newline=’’) as f:
writer = csv.writer(f)
writer.writerow(headers)
writer.writerows(values)
“”” - 第二种方法
“”“python
headers = [‘name’,‘age’,‘height’]
values = [
{‘name’:‘张三’,‘age’:18,‘height’:160},
{‘name’:‘李四’,‘age’:19,‘height’:180},
{‘name’:‘王五’,‘age’:20,‘height’:170}
]
with open(‘classroom.csv’,‘w’,encoding=‘utf-8’,newline=’’) as f:
writer = csv.Dictwriter(f,headers)
writer.writeheader()
writer.writerows(values)
“””
queue - q.put(block=False)默认是阻塞状态 如果put时队列满了一直阻塞到放进去为止。
- q.get(block=False)
- 第一种方法
实现爬虫的套路
- 准备url
- 准备start_url
- url地址规律不明显,总数不确定
- 通过代码提取下一页的url
- xpath
- 寻找url地址,部分参数在当前的响应中(比如当前页码数和总的页码数)
- 准备url-list
- 页码总数明确
- url地址规律明显
- 准备start_url
- 发送请求,获取响应
- 添加随机的user-agent,反反爬虫
- 添加随机的代理ip,反反爬虫
- 在对方判断出我们是爬虫之后,应该添加更多的headers字段,包括cookie
后续爬虫代码的建议
- 尽量减少请求次数
- 能抓取列表页就不抓详情页
- 保存获取到的html页面,供查错和重复请求使用
- 关注网站的所有类型的页面
- wap页面,触屏版页面
- H5页面
- APP
- 多伪装
- 动态的UA
- 代理ip
- 不使用cookie
- 利用多线程分布式
- 在不被ban的请求下尽可能的提高速度
selenium使用的注意点
-
获取文本和获取属性
- 先定位到元素,然后调用.text或者get_attribute方法来取。
-
selenium获取的页面数据是浏览器中elements的内容。
-
pass
-
如果页面中含有iframe。frame,需要先调用driver.switch_to.frame的方法或者switch_to_frame切换到frame中才能定位元素。
selenium常用操作 -
driver = webdriver.Chrom(executable_path=‘chromedriver路径’)
-
获取页面原码 driver.page_source
-
关闭当前页面:driver.close()
-
退出浏览器:driver.quit()
-
定位元素(element查找第一个,elements查找所有)
- 根据id来查找元素:find_element_by_id
- 根据类名查找元素:find_element_by_class_name
- 根据name属性的值来查找元素:find_element_by_name
- 根据标签名来查找元素:fing_element_by_tag_name
- 根据xpath语法获取元素find_element_by_xpath
- 根据css选择器选择元素:find_element_by_css_selector/find_element(BY.CSS_SELECTOR,“规则”)
-
常见的表单操作
- input标签
- 输入字符串:send_keys(‘python’)
- 清除 :clear()
- checkbok标签
- 选中/取消选中:click()
- select 标签
- select_by_index(0)
- select_by_value(“sdfsfaf”)
- select_by_visible_text(“sfaksfla”)
- 取消说有选中:deselect_all()
- input标签
-
行为链(鼠标的一些操作)
- from selenium.webdriver.common.action_chains import ActionCharins
-
Cookie操作
- 获取所有的cookie:driver.get_cookies() 得到一个列表for循环取值
- 根据cookie的key:driver.get_cookie(“key”)
- 根据key删除cookie:driver.delete_cookie(“key”)
- 删除所有cookie:driver.delete_all_cookies()
-
隐式等待和显示等待
-
打开多窗口
- driver.execute_script(“window.open(‘http://www.’)”)
-
切换窗口
- driver.switch_to_window(driver.window_handles[1])
-
设置代理ip
“”“python
options = webdriver.ChromeOptions()
options.add_argument(”–proxy-server=http://120.121.12:9999")
driver = webdriver.Chrome(executable_path=‘路径’,chrome_options=options)
“”"