当前位置:   article > 正文

python爬虫系列 —— 一些常用语法的实现总结_爬虫语法讲解

爬虫语法讲解

目录

一、requests模块用法

1、get请求

2、post请求

3、封装参数请求

二、爬虫解析器的三种方式

1、re模块

2、BeautifulSoup模块

3、xpath模块

三、selenium模块用法

1、基本用法

2、下拉框数据获取

3、登录验证码识别


一、requests模块用法

1、get请求

  1. # 安装requests
  2. # pip install requests
  3. # 国内源
  4. # pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
  5. import requests
  6. # 1get获取搜索信息
  7. url = "https://www.sogou.com/web?query=周杰伦"
  8. headers_value = {
  9. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"
  10. }
  11. resp = requests.get(url, headers=headers_value)
  12. print(resp.text)
  13. # 关闭连接
  14. resp.close()

2、post请求

  1. import requests
  2. url = "https://fanyi.baidu.com/sug"
  3. s = input("请输入你要翻译的英文单词")
  4. dat = {
  5. "kw": s
  6. }
  7. # 发送post请求, 发送的数据必须放在字典中, 通过data参数进行传递
  8. resp = requests.post(url, data=dat)
  9. print(resp.json()) # 将服务器返回的内容直接处理成json() => dict
  10. # 关闭连接
  11. resp.close()

3、封装参数请求

  1. import requests
  2. url = "https://movie.douban.com/j/chart/top_list"
  3. # 重新封装参数
  4. param = {
  5. "type": "24",
  6. "interval_id": "100:90",
  7. "action": "",
  8. "start": 0,
  9. "limit": 20,
  10. }
  11. headers = {
  12. "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"
  13. }
  14. resp = requests.get(url=url, params=param, headers=headers)
  15. print(resp.json())
  16. # 关闭连接
  17. resp.close()

二、爬虫解析器的三种方式

         re 利用正则匹配,在性能上远比 xpath bs4 高很多,但是在使用上难度较大,且后期维护的困难度也高很多;bs4 实际情况需要转换过程,在层数多且量大的情况下,实际效率 xpath 要比 bs4 高很多。总的来说,xpath 加上 scrapy-redis 的分布式已经非常满足性能要求了,建议入 xpath 的坑。

1、re模块

  1. import re
  2. # # findall: 匹配字符串中所有的符合正则的内容
  3. # lst = re.findall(r"\d+", "我的电话号是:10086, 我女朋友的电话是:10010")
  4. # print(lst)
  5. #
  6. # # finditer: 匹配字符串中所有的内容[返回的是迭代器], 从迭代器中拿到内容需要.group()
  7. # it = re.finditer(r"\d+", "我的电话号是:10086, 我女朋友的电话是:10010")
  8. # for i in it:
  9. # print(i.group())
  10. # # search, 找到一个结果就返回, 返回的结果是match对象. 拿数据需要.group()
  11. # s = re.search(r"\d+", "我的电话号是:10086, 我女朋友的电话是:10010")
  12. # print(s.group())
  13. # # match是从头开始匹配
  14. # s = re.match(r"\d+", "10086, 我女朋友的电话是:10010")
  15. # print(s.group())
  16. # # 预加载正则表达式
  17. # obj = re.compile(r"\d+")
  18. #
  19. # ret = obj.finditer("我的电话号是:10086, 我女朋友的电话是:10010")
  20. # for it in ret:
  21. # print(it.group())
  22. #
  23. # ret = obj.findall("呵呵哒, 我就不信你不换我1000000000")
  24. # print(ret)
  25. s = """
  26. <div class='jay'><span id='1'>郭麒麟</span></div>
  27. <div class='jj'><span id='2'>宋铁</span></div>
  28. <div class='jolin'><span id='3'>大聪明</span></div>
  29. <div class='sylar'><span id='4'>范思哲</span></div>
  30. <div class='tory'><span id='5'>胡说八道</span></div>
  31. """
  32. # (?P<分组名字>正则) 可以单独从正则匹配的内容中进一步提取内容
  33. obj = re.compile(r"<div class='.*?'><span id='(?P<id>\d+)'>(?P<wahaha>.*?)</span></div>", re.S) # re.S: 让.能匹配换行符
  34. result = obj.finditer(s)
  35. for it in result:
  36. print(it.group("wahaha"))
  37. print(it.group("id"))

2、BeautifulSoup模块

  1. # 安装
  2. # pip install bs4 -i 清华
  3. # 1. 拿到页面源代码
  4. # 2. 使用bs4进行解析. 拿到数据
  5. import requests
  6. from bs4 import BeautifulSoup
  7. import csv
  8. url = "http://www.xinfadi.com.cn/marketanalysis/0/list/1.shtml"
  9. resp = requests.get(url)
  10. f = open("菜价.csv", mode="w")
  11. csvwriter = csv.writer(f)
  12. # 解析数据
  13. # 1. 把页面源代码交给BeautifulSoup进行处理, 生成bs对象
  14. page = BeautifulSoup(resp.text, "html.parser") # 指定html解析器
  15. # 2. 从bs对象中查找数据
  16. # find(标签, 属性=值)
  17. # find_all(标签, 属性=值)
  18. # table = page.find("table", class_="hq_table") # class是python的关键字
  19. table = page.find("table", attrs={"class": "hq_table"}) # 和上一行是一个意思. 此时可以避免class
  20. # 拿到所有数据行
  21. trs = table.find_all("tr")[1:]
  22. for tr in trs: # 每一行
  23. tds = tr.find_all("td") # 拿到每行中的所有td
  24. name = tds[0].text # .text 表示拿到被标签标记的内容
  25. low = tds[1].text # .text 表示拿到被标签标记的内容
  26. avg = tds[2].text # .text 表示拿到被标签标记的内容
  27. high = tds[3].text # .text 表示拿到被标签标记的内容
  28. gui = tds[4].text # .text 表示拿到被标签标记的内容
  29. kind = tds[5].text # .text 表示拿到被标签标记的内容
  30. date = tds[6].text # .text 表示拿到被标签标记的内容
  31. csvwriter.writerow([name, low, avg, high, gui, kind, date])
  32. f.close()
  33. print("over1!!!!")

3、xpath模块

  1. import lxml.html
  2. etree = lxml.html.etree
  3. tree = etree.parse("b.html")
  4. # result = tree.xpath('/html')
  5. # result = tree.xpath("/html/body/ul/li/a/text()")
  6. # result = tree.xpath("/html/body/ul/li[1]/a/text()") # xpath的顺序是从1开始数的, []表示索引
  7. # result = tree.xpath("/html/body/ol/li/a[@href='dapao']/text()") # [@xxx=xxx] 属性的筛选
  8. # print(result)
  9. # ol_li_list = tree.xpath("/html/body/ol/li")
  10. #
  11. # for li in ol_li_list:
  12. # # 从每一个li中提取到文字信息
  13. # result = li.xpath("./a/text()") # 在li中继续去寻找. 相对查找
  14. # print(result)
  15. # result2 = li.xpath("./a/@href") # 拿到属性值: @属性
  16. # print(result2)
  17. #
  18. # print(tree.xpath("/html/body/ul/li/a/@href"))
  19. print(tree.xpath('/html/body/div[1]/text()'))
  20. print(tree.xpath('/html/body/ol/li/a/text()'))

三、selenium模块用法

    selenium可以模拟浏览器登录,点击,搜索等操作,配合xpath更为人性化,我们不必查找数据真实地址,而是直接读取浏览器已经解析好的数据,缺点是慢而且容器反爬。

1、基本用法

  1. from selenium.webdriver import Chrome
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.common.keys import Keys
  4. import time
  5. web = Chrome()
  6. web.get("http://www.lagou.com")
  7. # 1、找到某个元素. 点击它
  8. el = web.find_element(By.XPATH, '//*[@id="changeCityBox"]/p[1]/a').click()
  9. time.sleep(1)
  10. # 2、找到输入框. 输入python => 输入回车/点击搜索按钮
  11. web.find_element(By.XPATH, '//*[@id="search_input"]').send_keys("python", Keys.ENTER)
  12. # 3、查找存放数据的位置. 进行数据提取
  13. li_list = web.find_elements(By.XPATH, '//*[@id="jobList"]/div[1]/div')
  14. for li in li_list:
  15. job_name = li.find_element(By.XPATH, './div[1]/div[1]/div[1]/a').text
  16. job_price = li.find_element(By.XPATH, './div[1]/div[1]/div[2]/span').text
  17. company_name = li.find_element(By.XPATH, './div[1]/div[2]/div[1]/a').text
  18. print(company_name, job_name, job_price)
  19. # 4、如何进入到新窗口中进行提取
  20. # 注意, 在selenium的眼中. 新窗口默认是不切换过来的.【-1】表示切换到最后一个窗口也就是新窗口
  21. web.switch_to.window(web.window_handles[-1])
  22. # 在新窗口中提取内容
  23. job_detail = web.find_element_by_xpath('//*[@id="job_detail"]/dd[2]/div').text
  24. print(job_detail)
  25. # 5、如何从新窗口切回来
  26. # 关掉子窗口
  27. web.close()
  28. # 变更selenium的窗口视角. 回到原来的窗口中
  29. web.switch_to.window(web.window_handles[0])
  30. print(web.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[1]/div[1]/div[1]/div[1]/a/h3').text)
  31. # 6、如果页面中遇到了 iframe如何处理
  32. web.get("https://www.91kanju.com/vod-play/541-2-1.html")
  33. # 处理iframe的话. 必须先拿到iframe. 然后切换视角到iframe . 再然后才可以拿数据
  34. iframe = web.find_element_by_xpath('//*[@id="player_iframe"]')
  35. web.switch_to.frame(iframe) # 切换到iframe
  36. # web.switch_to.default_content() # 切换回原页面
  37. tx = web.find_element_by_xpath('//*[@id="main"]/h3[1]').text
  38. print(tx)
  39. # 7、无头浏览器
  40. from selenium.webdriver.chrome.options import Options
  41. # 准备好参数配置
  42. opt = Options()
  43. opt.add_argument("--headless")
  44. opt.add_argument("--disable-gpu")
  45. web = Chrome(options=opt) # 把参数配置设置到浏览器中
  46. web.get("https://www.baidu.com") # 此时不会弹出浏览器,静默操作

2、下拉框数据获取

  1. from selenium.webdriver import Chrome
  2. from selenium.webdriver.chrome.options import Options
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support.select import Select
  5. import time
  6. # 准备好参数配置
  7. opt = Options()
  8. opt.add_argument("--headless")
  9. opt.add_argument("--disable-gpu")
  10. web = Chrome(options=opt) # 把参数配置设置到浏览器中
  11. # web = Chrome()
  12. web.get("https://www.endata.com.cn/BoxOffice/BO/Year/index.html")
  13. time.sleep(2)
  14. # 定位到下拉列表
  15. sel_el = web.find_element(By.XPATH, '//*[@id="OptionDate"]')
  16. # 对元素进行包装, 包装成下拉菜单
  17. sel = Select(sel_el)
  18. # 让浏览器进行调整选项
  19. for i in range(len(sel.options)): # i就是每一个下拉框选项的索引位置
  20. sel.select_by_index(i) # 按照索引进行切换
  21. time.sleep(2)
  22. table = web.find_element(By.XPATH, '//*[@id="TableList"]/table')
  23. print(table.text) # 打印所有文本信息
  24. print("===================================")
  25. print("运行完毕. ")
  26. web.close()
  27. # 如何拿到页面代码Elements(经过数据加载以及js执行之后的结果的html内容)
  28. # print(web.page_source)

3、登录验证码识别

  1. chaojiying.py
  2. #!/usr/bin/env python
  3. # coding:utf-8
  4. import requests
  5. from hashlib import md5
  6. class Chaojiying_Client(object):
  7. def __init__(self, username, password, soft_id):
  8. self.username = username
  9. password = password.encode('utf8')
  10. self.password = md5(password).hexdigest()
  11. self.soft_id = soft_id
  12. self.base_params = {
  13. 'user': self.username,
  14. 'pass2': self.password,
  15. 'softid': self.soft_id,
  16. }
  17. self.headers = {
  18. 'Connection': 'Keep-Alive',
  19. 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
  20. }
  21. def PostPic(self, im, codetype):
  22. """
  23. im: 图片字节
  24. codetype: 题目类型 参考 http://www.chaojiying.com/price.html
  25. """
  26. params = {
  27. 'codetype': codetype,
  28. }
  29. params.update(self.base_params)
  30. files = {'userfile': ('ccc.jpg', im)}
  31. r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files,
  32. headers=self.headers)
  33. return r.json()
  34. def ReportError(self, im_id):
  35. """
  36. im_id:报错题目的图片ID
  37. """
  38. params = {
  39. 'id': im_id,
  40. }
  41. params.update(self.base_params)
  42. r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
  43. return r.json()
  44. if __name__ == '__main__':
  45. # 用户中心>>软件ID 生成一个替换 96001
  46. chaojiying = Chaojiying_Client('账号', '密码', '验证码')
  47. # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
  48. im = open('a.jpg', 'rb').read()
  49. # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
  50. print(chaojiying.PostPic(im, 1902))
  1. from selenium.webdriver import Chrome
  2. from chaojiying import Chaojiying_Client
  3. from selenium.webdriver.common.by import By
  4. import time
  5. web = Chrome()
  6. web.get("http://www.chaojiying.com/user/login/")
  7. # 处理验证码
  8. img = web.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/div[1]/form/div/img').screenshot_as_png
  9. chaojiying = Chaojiying_Client('账号', '密码', '验证码')
  10. dic = chaojiying.PostPic(img, 1902)
  11. verify_code = dic.get("pic_str")
  12. # verify_code = dic['pic_str']
  13. # 向页面中填入用户名, 密码, 验证码
  14. web.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input').send_keys("账号")
  15. web.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input').send_keys("密码")
  16. web.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input').send_keys(verify_code)
  17. time.sleep(2)
  18. # 点击登录
  19. web.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input').click()
  20. time.sleep(500)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/599532
推荐阅读
相关标签
  

闽ICP备14008679号