爬虫案例汇总
爬虫案例汇总
- 爬取天气数据
- 百度翻译
- 爬取药品许可证
- 华华手机网
- 菜场价格爬取
- 正则获取红牛数据
- 获取糗事百科图片
- 爬取优美图库图片
- 爬梨视频
- 爬取链家二手房数据
- 豆瓣数据改进爬取
- 实战猪八戒网
- 爬取城市名
- 爬取贴吧图片
- 小案例
- seleuinm模块cookie登录案例
- 图片验证码思路
- B战视频案例思路
- 红薯小说网案例
- 自动百度登录
- 京东数据获取
- 知乎案例
爬取天气数据
思路
1.查看前页面的数据加载方式 2.右键点击查看网页源码 3.ctrl+f搜索框输入查找数据,例如,将数据中任意一个数据输入搜索框。 4.继续验证按f12键查看network,点击XHR查看。
执行代码
# 调用模块 import requests import json # 输出你要的月份 mouth=input("输出你要的月份:") # 发送请求 res=requests.get('http://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=54511&areaInfo%5BareaType%5D=2&date%5Byear%5D=2021&date%5Bmonth%5D='+mouth ) # 将数据用json转义,获取data数据 print(res.json()['data'])
百度翻译
思路
1.输入单词时,可发现看页面动态变化,打开网络源码,查询数据,发现不是直接加载
2.使用network查看,动态数据加载,例如:在百度翻译中输入英文
代码
# 调用 import requests # 请求 res=requests.post('https://fanyi.baidu.com/sug', data={"kw": "b"} ) # 进行json格式转化为对应数据类型输出 # 循环输出结果 for d in res.json().get('data'): print(d)
爬取药品许可证
思路
1.查看目录数据的加载方式,复制数据,打开网络源码,ctrl+f输入复制数据内容 2.发现是动态加载 3.按f12,通过network查找xhr获取数据的地址和请求方式 4.执行post代码,查看获取数据结果 5.发现list是信息数据结果 6.打开详情页面,验证数据加载方式 7.发现是js动态加载,按f12、通过network查找xhr获取数据的地址和请求方式 8.发现url地址,post请求方式和id号 9.发现id数据与第一次爬取的公司简介里面的id一致 结论: 循环获取ID号,发送post请求,就可以循环获取每个公司的详情信息
代码
# 调用模块 import requests # 发送请求 res=requests.post(url="http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList", data={"on": "true", "page": 1, "pageSize": 15, "productName":"", "conditionType": 1, "applyname":"", "applysn":""}) # 获取信息 list_in=res.json().get("list") # 循环字典每个键值对 for com_id in list_in: # 获取ID ID=com_id.get("ID") # 执行post请求 res2=requests.post('http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById', # 请求题为id data={'id':ID}) # 输出结果 print(res2.json())
华华手机网
思路
1.在浏览器network选项中,请求体对应的关键字是Form Data 2.获取登陆地址,获取请求体From Data的数据内容 3.发送post请求,输入登录用户信息
代码
# 调用模块requests import requests # 发送get请求,data为亲求体, res=requests.post('http://www.aa7a.cn/user.php', data={ # 用户名 "username": "203432312@qq.com", # 密码 "password": "*******", # 验证码 "captcha": "5MU8", "remember": 1, "ref": "http://www.aa7a.cn/category-123-b0.html", # 状态:登陆中 "act": "act_login" } ) # 获取cookie内容 user_cookie=res.cookies.get_dict() # 使用cookie访问网站 res1= requests.get('http://www.aa7a.cn/', cookies=user_cookie ) # 获取页面信息,该网站登录成功后会显示用户名 if '203432312@qq.com' in res1.text: print('登录成功') else: print('登录失败')
菜场价格爬取
思路
1.查看页面加载方式,右键网络源代码 2.获取数据不在存在,此网站为js动态请求 3.在network中XHR,查找信息获取URL,确定请求方法 4.获取数据结果,选择需要的数据,发现list是我们需要的数据 5.分析数据,发现ID用于确定具体信息数据,一个组对应一个蔬菜 结论: 循环获取信息,发送post请求,就可以循环获取每个蔬菜的详情信息 6.查找目录数据信息与页数对应关系。 9.current参数用于控制页数,可通过for循环获取页数,循环输出个页面的数据 10.查看页面数为181417页设置循环,可以设置循环页数,以免服务器和电脑过载 ''' 爬取数据时,最好设置一个时间间隔,避免服务器工作量增大,客服端IP被封 '''
代码
代码 复制代码 # 调用模块 import requests import json import os # 判断是否存在蔬菜文件夹 if not os.path.exists(r'蔬菜'): # 创建蔬菜文件 os.mkdir(r'蔬菜') # 设置循环值,即页数 vert_page=int(input('请输入开始页码:')) # 结束页码 end_page=int(input('请输入结束页码:')) # 判断页码是否符合逻辑 if vert_page >= end_page: # 提示信息 print('结束页码不能小于开始页码') # 符合逻辑 else: # 设置循环 while vert_page <= end_page: # 发送post请求 res=requests.post("http://www.xinfadi.com.cn/getPriceData.html", # 请求头 headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"}, # 请求体 data={"limit": 20, # 页码参数 "current": vert_page, "pubDateStartTime":"", "pubDateEndTime":"", "prodPcatid":"", "prodCatid":"", "prodName":""} ) # 获取一页整体的蔬菜信息 blist=res.json().get("list") # 循环获取每个信息 for vert_id in blist: # 定义对应变量,蔬菜名 cname=vert_id.get('prodName') # 定义对应变量,生产地 cplace=vert_id.get('place') # 定义单位 cinfo=vert_id.get('unitfo') # cavPrice=vert_id.get('avgPrice') # 获取信息 print('菜名%s,产地%s,单位%s,品均价%s'%(cname,cplace,cinfo,cavPrice)) # 见蔬菜信息写入文件 with open(r'蔬菜\蔬菜%s.txt'%vert_id.get('prodName'), 'w',encoding="utf8") as f: # 以json格式,一行行写入 json.dump(vert_id,f) # 增加页码 vert_page+=1;
爬取红牛分公司数据
要求:获取红牛所有分公司详细数据(名称 地址 邮箱 电话)
思路:
1.判断数据加载方式,打开网络源地址,查找数据,发现为直接加载 2.进入network,查找url地址、请求方式或请求头等信息 3.执行代码筛选
执行代码:
# 调用模块 import requests from bs4 import BeautifulSoup # 请求数据 res=requests.get('http://www.redbull.com.cn/about/branch') # 构造解析对象 soup =BeautifulSoup(res.text,'lxml') # 获取公司名 h2_list=soup.find_all('h2') # 生成公司名列表 namelist=[title.text for title in h2_list] # 获取具体地址 p_add=soup.find_all(attrs={'class':'mapIco'}) # 生成地址列表 addr_list = [tag.text for tag in p_add] # 获取邮箱 p_mail=soup.select('.mailIco') # 生成邮箱列表 email_list = [tag.text for tag in p_mail] # 获取电话 p_phone=soup.select('.telIco') # # 生成电话列表 phone_list = [tag.text for tag in p_phone] # 循环输出数,以表长为索引值 for i in range(len(h2_list)): print(''' 公司名称:%s 公司地址:%s 公司邮箱:%s 公司电话:%s '''%(addr_list[i],addr_list[i], email_list[i], phone_list[i]))
正则获取红牛数据
思路
# 1.判断数据加载方式,打开网络源地址,查找数据,发现为直接加载 # 2.进入network,查找url地址、请求方式或请求头等信息 # 3.执行代码筛选
执行代码
# 调用模块 import requests import json import re # 请求数据 res=requests.get('http://www.redbull.com.cn/about/branch') res_text=res.text # 获取公司名,去除多余符号 h2_list=re.findall('<h2>(.*?)<',res_text) # 获取具体地址,去除多余符号 p_add=re.findall("mapIco'>(.*?)<",res_text) # 获取邮箱,去除多余符号 p_mail=re.findall("mailIco'>(.*?)<",res_text) # 获取电话,去除多余符号 p_phone=re.findall("telIco'>(.*?)<",res_text) # 拉链方法,生成一个迭代器 res2=zip(h2_list,p_add,p_mail,p_phone) # 循环输出迭代器 for i in res2: print(i)
获取糗图百科图片
思路
1.查看图片加载方式,发现为直接加载 2.所以判断:可以直接向本网页发送get请求,获取数据信息 3.打开network查看url地址,请求方式 4.循环获取每个图片的url地址 5.像图片地址发送请求,获取图片信息后写入文件
执行代码
import requests import requests from bs4 import BeautifulSoup import os # 判断是否存在蔬菜文件夹 if not os.path.exists(r'图片'): # 创建蔬菜文件 os.mkdir(r'图片') img_page=input('亲输入你要的页面:') # 发送请求 res=requests.get(url='https://www.qiushibaike.com/imgrank/page/%s'%img_page) # 构造解析对象 soup=BeautifulSoup(res.text,'lxml') # 获取图片数据 img_info=soup.select('img.illustration') # print(img_info) # 循环获取图片信息 for img in img_info: # 获取图片地址 img_info_src = img.get('src') # 图片地址不完整,所以要整合 img_info_src='https:'+img_info_src # 向图片地址发送请求 res2=requests.get(img_info_src) # 获取图片名,输入图片保存 with open(r'图片\%s.jpg'%img_info_src.rsplit('/')[-1].strip('.jpg'),'wb') as f: # 以二进制格式写入 f.write(res2.content)
爬取
思路
1.打开网址查看数据加载方式,方法是打开网络源码查看数据是否存在
2.存在为直接加载,不存在为js动态申请,发现数据为js动态加载
3.打开network查看url地址,请求方式
4.获取首页所有详细页面地址后,执行循环向详细页面地址发送请求
5.进入详细页面时,查看图片加载方式
6.network查看url地址,请求方式,请求体或请求头文件
7.期间还需要观察数据之间的联系,为了方便索引取值
8.向图片地址发送请求获取图片信息
执行代码
# 调用模块 import requests import os from bs4 import BeautifulSoup # 判断文件是否存在 if not os.path.exists(r'高清'): os.mkdir(r'高清') # 发送请求 res=requests.get('https://www.umei.cc/meinvtupian/rentiyishu/index.htm') # 获取解析对象 soup=BeautifulSoup(res.text,'lxml') # 获取各个图片详细页面 img_info=soup.select('.TypeList .TypeBigPics') # 循环取值 for a in img_info: # 获取地址 img_href=a.get('href') print(img_href) # 是地址完整 img_href="https://www.umei.cc/"+img_href res2=requests.get(img_href) # 定义解析对象 soup2=BeautifulSoup(res2.text,'lxml') # 获取class为.imageBody标签的子img标签 img_src=soup2.select('.ImageBody img') for img_for_src in img_src: # 获取图片地址 img_src_real=img_for_src.get('src') # 像地址发送请求 res3=requests.get(img_src_real) # 命名文件,二进制写入,命名规则为网址末尾从右往左 file_path = os.path.join(r'高清',img_src_real[-10:]) # 二进制写入, with open(file_path,'wb') as f: # 将文件写入 f.write(res3.content) print(img_src_real[-10:]+'爬取成功') time.sleep(1)
爬取梨视频
思路
1.打开网址查看数据加载方式,方法是打开网络源码查看视频数据是否存在
2.存在为直接加载,不存在为js动态申请,发现数据为js动态加载
3.打开network查看url地址,请求方式,视频文件多为get请求
4.获取首页所有详细页面地址后,执行循环向详细页面地址发送请求
5.进入详细页面时,查看视频加载方式
6.network查看url地址,请求方式,请求体或请求头文件
systemTime
srcUrl
7.获取信息后,发现不是视频数据
8.再对请求结果的观察中发现真实地址与请求结果地址有相似的地方,但也有不同的地方
9.通过特定的值将请求结果地址替换为真实地址,利用视频ID与systemTIme进行替换,就可以发送求获得视频
10.梨视频存在防爬链,需要在请求返回值中查找referer键值对
11.将referer键值对,作为请求头加入请求
12.向视频的地址发送请求获取视频信息
13.最好设置时间间隔,不要要频繁
代码
# 调用模块 import requests from bs4 import BeautifulSoup import os # 发送get请求网址 res=requests.get('https://www.pearvideo.com/category_9') # 构造解析对象 soup=BeautifulSoup(res.text,'html') # 发送请求 res2=requests.get('https://www.pearvideo.com/videoStatus.jsp?', # 请求体确定视频 params={"contId": video_id}, # 请求头输入防爬链 headers={"Referer": "https://www.pearvideo.com/video_%s"%video_id}, ) # 因为是json格式,使用json转义对应数据,获取假的视频地址 fake_href=res2.json()["videoInfo"]["videos"]['srcUrl'] # 获取冲突值 systemtime=res2.json()["systemTime"] # 将假地址变成真地址 real_href=fake_href.replace(systemtime,'cont-%s'%video_id) # 发送请求 res4=requests.get(real_href, # 请求体确定视频 params={"contId": video_id}, # 请求头输入防爬链 headers={"Referer": "https://www.pearvideo.com/video_%s" % video_id}, ) # 路径拼接 file_path=os.path.join(r'视频',real_href[-8:]) # 打开路径,以二进制写入 with open(file_path,'wb') as f: # 写入数据 f.write(res4.content) # 提示成功 print("请下载成功") # 等待时间 time.sleep(1)
爬取链家二手房数据
思路
1.查看数据加载方式, 2.查看网络network中的获取信息,得到url、请求头、防爬链 3.向网页发送请求,获取各详情页的信息
代码
import requests from bs4 import BeautifulSoup from openpyxl import Workbook # 创建地域字典 where_place={'上海':'sh','北京':'bj','深圳':'sz','武汉':'wh'} # 获取城市名 locale_place=input('哪个城市:') # 判断字典内是否存在 if locale_place not in where_place: print('没有该城市数据') # 城市存在 else: # 获取页数 page_num=input('要几页:') # 发送请求 res=requests.get('https://%s.lianjia.com/ershoufang/https://cs.lianjia.com/ershoufang/pg%s'%(where_place[locale_place],page_num)) # 构造对象 wb = Workbook() # 构造工作簿1 wb1=wb.create_sheet('房子数据',0) # 先定义表头 wb1.append(['房屋名称','小区名称','区域名称','详细信息','关注人数','发布时间', '总价', '单价']) # 创建地域字典 where_place={'上海':'sh','北京':'bj','深圳':'sz','武汉':'wh'} # 获取城市名 locale_place=input('哪个城市:') # 判断字典内是否存在 if locale_place not in where_place: print('没有该城市数据') # 城市存在 else: # 获取页数 page_num=input('要几页:') # 发送请求 res=requests.get('https://%s.lianjia.com/ershoufang/https://cs.lianjia.com/ershoufang/pg%s'%(where_place[locale_place],page_num)) # 构造对象 soup =BeautifulSoup(res.text,'lxml') # 获取指定li标签信息 li_list=soup.select('ul.sellListContent>li') # 循环获取单个li标签 for li in li_list: # 有些li标签内部是广告不是地址信息 try: # 获取名字 title=li.select('div.title>a')[0].text # 无法获取的情况下 except Exception as f: # 继续 continue # 获取地址 address=li.select('div.positionInfo')[0].text # 进行地址分割 real_add =address.split('-') # 因为有一些地址格式不统一所以要进行不同的处理 if len(real_add) ==2: # 解压赋值 add_name,add_loc=real_add # 格式不同的情况下 else: # 链式赋值结果都相同 add_name=add_loc=real_add # 获取详细信息 house_detail=li.select('div.houseInfo')[0].text # 获取时间,但是时间的文本需要分割 people_num,publish_time = li.select('div.followInfo')[0].text.split('/') # 获取总价 all_price=li.select('div.totalPrice')[0].text # 获取单价 one_price=li.select('div.unitPrice')[0].text # 写入表格 wb1.append([title,add_name,add_loc,house_detail,people_num,all_price,one_price]) # 保存文件 wb=(r'房子数据.xlsx')
爬取汽车之家新闻数据
思想
1.查看数据加载方式, 2.查看网络network中的获取信息,得到url、请求头、防爬链 3.向网页发送请求,获取各详情页的信息
代码
# 调用模块 import requests from bs4 import BeautifulSoup from openpyxl import Workbook # 构造文件对象 wb=Workbook() # 构造工作簿 wb1=wb.create_sheet('汽车') # 创建表头 wb1.append(['标题','链接','图标链接','发布时间','新闻简介']) # 发送请求,需要请求头 res = requests.get('https://www.autohome.com.cn/news/', headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36" } ) print(res.text) # 字符编码 res.encoding='gbk' # 构造对象 soup = BeautifulSoup(res.text, 'lxml') # 查找所有的li标签 li_list=soup.select('ul.article>li') # 循环获取li标签 for li in li_list: # 获取详情链接 a_tag=li.find('a') # 判断标签是否有意义 if not a_tag: # 标签不是所要内容时,结束循环 continue # 获取新闻链接 link='https:'+a_tag.get('href') # 获取标题 news_title=li.find('h3') # 判断标签是否有意义 if not news_title: # 标签不是所要内容时,结束循环 continue # 获取标签 news_title=news_title.text # 获取图片链接 img_src=li.find('img') if not img_src: # 标签不是所要内容时,结束循环 continue # 获取图片链接 news_img=img_src.get('src') # 获取发布时间 news_title_time=li.find('span').text # 获取简介 news_detail=li.find('p').text # 获取观看次数 news_watch=li.find('em').text # 获取评论次数 news_resp=li.find('em',attrs={'data-class':'icon12 icon12-infor'}).text # 写入数据 wb1.append([news_title,link,news_img,news_title_time,news_detail,news_watch,news_resp]) # 保存数据 wb.save(r'汽车数据.xlsx')
豆瓣数据改进爬取
思路
1.查看数据加载方式 2.查看网络network中的获取信息,得到url、请求头、防爬链 3.查看多页查询的方式,结合网址和请求获取信息观察 4.向网址请求信息,获取数据 5.通过bs4模块或者正则方法查找数据
代码
# 调用函数 import time import requests from openpyxl import Workbook from bs4 import BeautifulSoup import re # 创建对象 wb=Workbook() # 创建工作簿 wb1=wb.create_sheet('豆瓣250') # 创建表单 wb1.append(['名称','导演','评分','评分人数','座右铭']) #获取页数指令 page_num=int(input('要几页:')) # 循环获取每页信息 for i in range(page_num): # 进行赋值 page_id=i*25 # print(page_id) # 发送请求 res=requests.get('https://movie.douban.com/top250?start=%s'%page_id, # 加入user—agent和防爬链 headers={"referer":"https://movie.douban.com/top250?start=0", "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36" }) # 构造计息对象 soup=BeautifulSoup(res.text,'lxml') # 查找信息位置 film_list=soup.select('ol.grid_view div.item') # 循环获取每个电影的信息 for film_info in film_list: # 获取电影名 filmname=film_info.img.attrs.get('alt') # 获取职工成员 filmmake=film_info.find(name='div',attrs={'class':'bd'}).find(name='p') # print(filmmake.text) # 获取导演名,有空格的 makername=re.findall('导演: (.*?) ',filmmake.text) # 获取评分 film_code=film_info.find(name='span',class_='rating_num').text # 获取评分人数位置 code_num=film_info.select('div.star span') # 获取评分人数 code_nonum=code_num[3].text # 获取座右铭 try: film_word=film_info.select("p.quote span")[0].text # 如果操作错误,赋值为0 except Exception as f: film_word=None #申明首行 rows=1 # 写入数据 if rows<=len(film_list): # 某行第一列 wb1.cell(column=1,row=rows,value=filmname) # 某行第二列 wb1.cell(column=2,row=rows,value=str(makername)) # 某行第三列 wb1.cell(column=3,row=rows,value=film_code) # 某行第四列 wb1.cell(column=4,row=rows,value=code_nonum) # 某行第五列 wb1.cell(column=5,row=rows,value=film_word) # 行数加一 rows+=1 # wb1.append([filmname,str(makername),film_code,code_nonum,film_word]) # 在此是实验一次 break # 停顿一秒 time.sleep(1) # 保存文件 wb.save(r'电影.xlsx')
实战猪八戒网
思路
1.打开网址,查看数据加载方式 2.发现是直接加载,查看请求方式,可以直接向网址发送请求,获取相关请求体信息 3.获取数据后,选用喜欢的模块来获取相关数据
代码
# 代用模块 import requests from bs4 import BeautifulSoup from lxml import etree # 构造表格对象 wb=Workbook() # 构造工作簿 wb1=wb.create_sheet('猪八戒',0) # 创建表头文件 wb1.append(['价格','公司','接单数','详细信息','地址']) # 发送get请求 res=requests.get('https://shanghai.zbj.com/search/f/?', params={"kw": "python"} ) # 构造对象 zhu_html=etree.HTML(res.text) # 先查找所有的外部div标签 zhu_div=zhu_html.xpath('/html/body/div[6]/div/div/div[2]/div[5]/div[1]/div') # 循环获取div for div in zhu_div: # 获取价格 zhu_price=div.xpath('.//span[@class="price"]/text()') # 获取公司名 zhu_name=div.xpath('./div/div/a[1]/div[1]/p/text()') # 获取接单数 zhu_num =div.xpath('./div/div/a[2]/div[2]/div[1]/span[2]/text()') # 获取详细信息 zhu_info=div.xpath('.//div/a[2]/div[2]/div[2]/p/text()') # 获取地址 zhu_address=div.xpath('./div/div/a/div[1]/div/span/text()') # 名字的格式不都一样 try: # 将名字中多余部分去除 name=zhu_name[1].strip('\\n') # 如果发生错误 except Exception as f: # 名字为空 name='' # 名字的格式不都一样,无法获取 try: # 输入信息 wb1.append([zhu_price[0],name,zhu_num[0],zhu_info[0],zhu_address[0]]) except Exception as f: continue # break # 保存文件 wb.save('猪八戒.xlsx')
爬取城市名
目的网址:https://www.aqistudy.cn/historydata/
思路
1,查看详细页面,查看数据加载方式 2,查看network获取url,请求方式获取,请求体信息需要请求值
3,根据网络源码的信息布局获取页面,选择适合的选择器和解析方法
代码
# 调用模块 import requests from lxml import etree # 发送请求获取页面数据 res=requests.get('https://www.aqistudy.cn/historydata/', headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36" } ) # 构造对象 city_list= etree.HTML(res.text) # 获取热门城市 hot_city=city_list.xpath('/html/body/div[3]/div/div[1]/div[1]/div[2]/ul/li/a/text()') # 获取其他城市 other_city=city_list.xpath('/html/body/div[3]/div/div[1]/div[2]/div[2]/ul/div[2]/li/a/text()')
爬取贴吧图片
思路
1.打开页面查看加载方式,发现是动态加载,当前页面的图片为假的 2.但可以获得各个帖子的url地址,打开network查看加载方式,和请求体等信息 3.向地址发送请求,循环获取贴吧地址,贴吧地址不完整,需要拼接 4.进入详细页面,发现图片为直接加载 5.发现帖子的img标签都为class=“BDE_Image”, 6.查看network查看加载方式,和请求体等信息
代码
# 调用模块 import requests from lxml import etree import os import time # 获取用户想要爬取的贴吧名称 tieba = input('请输入贴吧的名称:').strip() # 获取页数 page_num=int(input('要多少页:').strip()) # 判断当前贴吧名称是否存在对应的文件夹 if not os.path.exists(tieba): # 创建文件 os.mkdir(tieba) # 设置默认值 i=0 # 循环获取个页面 while i <=page_num: # 页面成50 now_page=i*50 # 发送请求 res = requests.get('https://tieba.baidu.com/f?kw=%s&ie=utf-8&pn=%s'%(tieba,now_page), ) # 生成对象 tree = etree.HTML(res.text) # 查找链接地址 a_link_list = tree.xpath('//a[@class="j_th_tit "]/@href') base_url = 'https://tieba.baidu.com' # 循环获取每一个帖子链接 拼接成完整的地址 再发送请求 for link in a_link_list: # 拼接完整地址 full_link = base_url + link print(full_link) # 发送详情页请求获取页面数据 res1 = requests.get(full_link) tree1 = etree.HTML(res1.text) # 筛选图片链接 img_src_list = tree1.xpath('//img[@class="BDE_Image"]/@src') # 循环请求每个图片地址 for img_src in img_src_list: print(img_src) # 发送请求 res2 = requests.get(img_src) # 拼接路径 file_path = os.path.join(tieba,img_src[-15:]) # 打开文件以二进制模式写入 with open(file_path,'wb') as f: # 写入图片 f.write(res2.content) # 暂停一秒 time.sleep(1) # 在此只获取一个图片 break # 页数加一 i+=1 # 同上道理怕被封 break
小案例
# 调用模块 from selenium import webdriver from selenium.webdriver.common.keys import Keys # 键盘按键操作 import time # 构造对象 bro = webdriver.Chrome('D:\python3.6.8\Scripts\chromedriver.exe') # 打开淘宝 bro.get('https://www.taobao.com/') # 查找搜索框标签 input_tag = bro.find_element_by_id('q') # 输入文本内容 input_tag.send_keys('iphone手机') time.sleep(1) # 点击搜索 input_tag.send_keys(Keys.ENTER) time.sleep(5) # 关闭浏览器 bro.close()
seleuinm模块cookie登录案例
思路
1,用selenium模块打开网址
2设置时间让用户手动登录
3再用selecuinm获取cookie
4用requests使用cookie去模拟爬取数据
代码
# 调用模块 import requests from selenium import webdriver import time import json # 定义网络地址 url = 'https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F' # 常见对象 driver = webdriver.Chrome('D:\python3.6.8\Scripts\chromedriver.exe') # 访问网页 driver.get(url=url) # 预留时间让用户输入用户名和密码 time.sleep(30) # 刷新页面为获取cookie driver.refresh() # 获取登录成功之后服务端发返回的cookie数据 c = driver.get_cookies() # 写入文件保存以备用 with open('xxx.txt', 'w') as f: # 以json格式写入 json.dump(c, f) # 设施cookies存储变量 cookies={} # 打开文件 with open('xxx.txt', 'r') as f: # 输出数据到di di = json.load(f) # 获取数据,把数据转化为requesrts使用的模式,只有name和value是所需要的 for cookie in di: # 数据转化 cookies[cookie['name']] = cookie['value'] print(cookies)
图片验证码思路
思路1:
图像识别技术 软件:Tesseract-ocr 模块:pytesseract
思路2:
打码平台 花钱买第三方服务 先使用代码识别如果不想其实还有一帮员工肉眼识别
思路3:
自己人工识别
B站视屏案例思路
具体代码网址:
https://www.cnblogs.com/xiaoyuanqujing/articles/12016934.html
https://www.cnblogs.com/xiaoyuanqujing/articles/12014416.html
""" b站有很视频是一分为二的 分为视频(只有画面没有声音)和音频(视频配套的声音) """
思路
1.获取任意视频地址 2.分析页面,代开network一个为视屏每一个为音频 3.查看数据加载方式,url 4.向url发送请求,用requests获取 5.将数据存储如文件,循环发送请求加载,把数据写入文件即可
红素网小说案例
案例网址:https://www.cnblogs.com/xiaoyuanqujing/protected/articles/11868250.html
思路
1.小说详情页面鼠标左右键禁用,但是支持按F12调出控制台 2.小说文字不全是直接加载,查找相关二次请求 3.通过观察请求发现网址和请求体信息的对应关系 4,涉及到数据解密肯定需要写js代码 并且一般都会出现关键字decrypt,在source中点击top右键search in all file,搜索decrypt,可以发现多个数据 5.通过寻找content和data发现关键数据 6.点击内容查看数据,确定所要的内容为之前加密数字 7.获取content的数据和other的数据,得到js代码,这就需要进行专门的数据进行解密 8.只解密content的代码会有确实,也需要other代码 9.创建html文本储存content的js代码和other的js代码
自动百度登录
思路
1.获取登录链接,向链接输入指令 2.获取用户和密码输入框的位置,输入信息 3.输入登录信息后,获取登陆键位置,点击登录键,完成登录
代码执行
# 调用模块 from selenium import webdriver from selenium.webdriver.common.keys import Keys # 键盘按键操作 from selenium.webdriver import ActionChains import time # 构造对象 bro = webdriver.Chrome('D:\python3.6.8\Scripts\chromedriver.exe') # 打开百度登录 bro.get('https://www.baidu.com') time.sleep(1) # 查找登录按钮 bro.find_element_by_xpath('//*[@id="s-top-loginbtn"]').click() time.sleep(1) # 查找用户名框,输入文本内容 bro.find_element_by_id('TANGRAM__PSP_11__userName').send_keys('11111') time.sleep(1) # 查找密码框 bro.find_element_by_id('TANGRAM__PSP_11__password').send_keys('11111') time.sleep(1) # 登录键 bro.find_element_by_xpath('//*[@id="TANGRAM__PSP_11__submit"]').click() time.sleep(1) # 结束驱动器 bro.quit()
京东数据
思路
1.使用selenium进入网页找到搜索框标签,输入内容 2.进入商品页面中,先执行滚轮操作,加载所有数据 3.图片数据存在懒加载现象,要进行特俗操作 4.数据爬取,可以通过循环来获取 5.使用selenuim寻找下一页只需要点击按钮即可 将单页数据代码分装成一个函数 之后可以循环爬取多页 6.数据可持续化,将数据写入表格或文本
代码执行
# 调用模块 from selenium import webdriver from selenium.webdriver.common.keys import Keys # 键盘按键操作 import time from openpyxl import Workbook # 创建表格对象 wb = Workbook() # 创建工作簿 wb1=wb.create_sheet('商品',0) # 插入表头 wb1.append(["商品名","商品价格","商品图片连接","商品链接","店名","店铺链接","销量"]) # 创建对象 bro=webdriver.Chrome("D:\python3.6.8\Scripts\chromedriver.exe") # 打开京东链接 bro.get('https://www.jd.com/') # 演示等待 bro.implicitly_wait(10) # 寻找搜索框ID input_tag=bro.find_element_by_id('key') # 输入文本内容 input_tag.send_keys('显卡') # 设置延迟 time.sleep(0.5) # 点击搜索 input_tag.send_keys(Keys.ENTER) # 设置延迟 time.sleep(0.5) # 滚动加载数据,数据源于网页长度 for i in range(0, 11810, 1000): # 执行js语句,实现滚轮滑动 bro.execute_script('window.scrollTo(0,%s)'%i) # 设置延迟, time.sleep(0.3) # 获取所有商品数据 all_thing= bro.find_elements_by_css_selector('li.gl-item') # 获取具体商品信息 for li in all_thing: # 获取图标链接 img_src=bro.find_element_by_css_selector('div.p-img img').get_attribute('src') # img的src属性存在懒加载现象,src没有就在data-lazy—img属性下 # 如果src不存在 if not img_src: img_src = 'https' + bro.find_element_by_css_selector('div.p-img img').get_attribute('data-lazy-img') # 商品名 thing_name=li.find_element_by_css_selector('div.p-name a em').text # 商品价格 thing_price=li.find_element_by_css_selector('div.p-price strong').text # 商品连接 thing_link=li.find_element_by_css_selector('div.p-name a').get_attribute('href') # 销量 thing_pay=li.find_element_by_css_selector('div.p-commit strong a').text # 店名 shop_name=li.find_element_by_css_selector('div.p-shop span a').text # 电商连接 shop_link=li.find_element_by_css_selector('div.p-shop span a').get_attribute('href') wb1.append([thing_name,thing_price,img_src,thing_link,shop_name,shop_link,thing_pay]) break wb.save(r'商品.xlsx')
知乎登录案例
思路
1.电脑端登录知乎需要用户名与密码 2.人工输入用户信息,并滑动验证码后,查看network,查找请求体获取加密信息 加密的代码关键字:encrypt 解密的代码关键字:decrypt 3.在所network的source的top文件中,搜索所有文件中的encrypt 4.在多条数据中搜索正确的数据获取加密数据 5.在js代码出打断点,运行网页就可以获取加密数据 6.之后将该数据进行解析,并对数据进行分析,处理完之后signature为加密数据,需要模块解密 7.解析出数据后,获取cookie请求头,请求体,发送请求获取数据