爬虫案例大型汇总

概要

1、爬取天气数据

2、爬取百度翻译

3、爬取药品许可证

4、爬取蔬菜价格

5、爬取红牛分公司数据

6、爬糗图百科(正则/bs4)

7、爬取优美图库的高清图片

8、爬取梨视频汽车视频数据

9、爬取豆瓣电影top250

10、爬取链接二手房数据

11、爬取汽车之家新闻数据

12、爬取城市名称

13、爬取猪八戒

14、爬取贴吧图片

15、百度自动登录

16、爬取京东商品数据

详情

  • 爬取天气数据

import requests

urlW = 'http://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=60010&areaInfo%5BareaType%5D=2&date%5Byear%5D=2021&date%5Bmonth%5D=9'
res = requests.get(urlW)
dictW = res.json().get('data')
print(dictW)
View Code
  • 爬取百度翻译

import requests

urlEng = 'https://fanyi.baidu.com/sug'
# 搜索框下拉数据
resE = requests.post(urlEng,
                     headers={
                         'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36X-Requested-With: XMLHttpRequest'},
                     data={
                         'kw': 'q'
                     })
dataE = resE.json().get('data')
for d in dataE:
    print(d)
View Code
  • 爬取药品许可证

# 1.引入requests模块用于发送网络请求
import requests

# 2.指定查找药品信息的url
urlXkzsList = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
# 3.指定查找详情的url
urlXkzsDetail = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
# 4.选择想查询几页
num = int(input('请输入想要查询的页数:').strip())
# 5.逐页循环获取药企信息
for n in range(1, num+1):
    # 6.将请求体信息放入post请求并向上述url发送
    res = requests.post(urlXkzsList,
                        data={
                            'on': 'true',
                            'page': n,  # 页码
                            'pageSize': 15,  # 每页数据行数
                            'productName': '',
                            'conditionType': 1,
                            'applyname': '',
                            'applysn': ''
                        })
    # 7.获取上述的响应,为单页药企概要信息
    dataList = res.json().get('list')
    # 8.循环获取每家药企的信息
    for d in dataList:
        # 9.向每家药企发送携带企业ID的post请求
        resD = requests.post(urlXkzsDetail, data={'id': d.get('ID')})
        # 10.将请求结果(单家药企信息)反序列化成字典
        resDict = resD.json()
        # 11.获取企业名称
        comName = resDict.get('epsName')
        # 12.打开企业信息文件
        with open(r'company.txt', 'a', encoding='UTF-8') as f:
             # 将详情信息写入该文件
             f.write('企业名称:{}\n{}\n'.format(comName, str(resDict)))
View Code

 

  • 爬取蔬菜价格

# 1.引入requests模块用于发送网络请求
import requests

"""
    蔬菜网站 
    http://www.xinfadi.com.cn/priceDetail.html
"""
# 2.首页加载时向该url发送post请求
urlP = 'http://www.xinfadi.com.cn/getPriceData.html'
# 3.输入想要查找的页数
num = int(input('请输入想要查找的页数:').strip())
# 4.按照页循环
for n in range(1, num+1):
    # 3.设置请求的请求体参数
    dataP = {
        'limit': 20,     # 每页限制条数
        'current': n,   # 当前页
        'pubDateStartTime': '',
        'pubDateEndTime': '',
        'prodPcatid': '',
        'prodCatid': '',   # 默认1186为蔬菜的编号
        'prodName': ''
    }
    # 4.发送post请求
    resP = requests.post(
        urlP,
        headers={
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
        },
        data=dataP
    )
    # 5.获取上述请求的响应,为单页蔬菜价格信息
    vegeList = resP.json().get('list')
    # 6.循环写入每一条蔬菜数据
    for i in vegeList:
        # 7.获取蔬菜名称
        prodName = i.get('prodName')
        # 8.获取当天日期
        pubDate = i.get('pubDate')
        # 9.打开存放蔬菜价格的文件
        with open(r'vegetablePrice.txt', 'a', encoding='UTF-8') as f:
            # 10.将价格信息写入文件
            f.write('{}——{}\n{}\n'.format(pubDate, prodName, i))
View Code
  • 爬取红牛分公司数据

1、正则

import requests
import re

# 1.向红牛网站发送请求
comRes = requests.get('http://www.redbull.com.cn/about/branch')
# 2.获取红牛分公司名称、地址、邮编、电话
cNameList = re.findall("data-title='(.*?)'", comRes.text)
cAddrList = re.findall("data-describe='(.*?)'", comRes.text)
cMailList = re.findall("class='mailIco'>(.*?)<", comRes.text)
cTelList = re.findall("class='telIco'>(.*?)<", comRes.text)
# 3.将获取到的分公司数据一一对应(按照名称循环)
for i in range(len(cNameList)):
    print(""" 
        公司名称:{}
        公司地址:{}
        公司邮箱:{}
        公司电话:{} 
    """.format(cNameList[i], cAddrList[i], cMailList[i], cTelList[i])
          )
View Code

2、bs4

import requests
from bs4 import BeautifulSoup

# 1.数据就在页面上显示,直接发送请求即可
res = requests.get('http://www.redbull.com.cn/about/branch')
soup = BeautifulSoup(res.text, 'lxml')
# 2.获取分公司名称
h2List = soup.find_all('h2')
nameList = [tag.text for tag in h2List]
# 3.获取分公司地址
p1List = soup.find_all(name='p', attrs={'class': 'mapIco'})
addrList = [tag.text for tag in p1List]
# 4.获取分公司邮编
p2List = soup.find_all(name='p', attrs={'class': 'mailIco'})
postalCodeList = [tag.text for tag in p2List]
# 5.获取分公司电话
p3List = soup.find_all(name='p', attrs={'class': 'telIco'})
phoneList = [tag.text for tag in p3List]
# 6.将获取到的分公司数据一一对应(按照名称循环)
for i in range(len(nameList)):
    print("""
    公司名称:{}
    公司地址:{}
    公司邮箱:{}
    公司电话:{} 
    """.format(nameList[i], addrList[i], postalCodeList[i], phoneList[i])
          )
View Code
  • 爬糗图百科(正则/bs4)

1、正则

import requests
import os
import re

# 1.图片在网页上,直接发送请求即可
qiushiRes = requests.get('https://www.qiushibaike.com/imgrank/')
resText = qiushiRes.text
# 2.通过正则匹配糗图
imgList = re.findall('<img src="(.*?)" alt="糗事.*"', resText)
# 3.判断是否存在存放图片文件夹,不存在则创建
if not os.path.exists(r'糗图'):
    os.mkdir(r'糗图')
# 4.循环获得的图片
for imgLink in imgList:
    # 5.组合图片链接
    realLink = "https:"+imgLink
    # 6.向图片链接发送get请求,返回流文件
    image = requests.get(realLink, stream=True)
    # 7.新建图片文件
    with open(r'糗图\{}'.format(imgLink.split('/')[-1]), 'wb') as f:
        # 8.逐行写入
        for line in image.iter_content():
            f.write(line)
View Code

2、bs4

import requests
from bs4 import BeautifulSoup
import os
# 1.图片在网页上,直接发送请求即可
qiushiRes = requests.get('https://www.qiushibaike.com/imgrank/')
resText = qiushiRes.text
# 2.构造解析器对象
soup = BeautifulSoup(resText, 'lxml')
# 3.判断是否存在存放图片文件夹,不存在则创建
if not os.path.exists(r'糗图'):
    os.mkdir(r'糗图')
# 34.查找图片
imgTagList = soup.find_all(name='img', attrs={'class': 'illustration'})
for img in imgTagList:
    # 4.拼接完整链接
    realLink = 'https:' + img.get('src')
    # 5.向图片链接发送get请求,返回流文件
    image = requests.get(realLink, stream=True)
    # 6.新建图片文件
    with open(r'糗图\{}'.format(img.get('src').split('/')[-1]), 'wb') as f:
        # 8.逐行写入
        for line in image.iter_content():
            f.write(line)
View Code
  • 爬取优美图库的高清图片

import requests
from bs4 import BeautifulSoup
import os
import time

# 1.判断存放图片的目录是否存在,不存在则自动创建
if not os.path.exists(r'动漫图片'):
    os.mkdir(r'动漫图片')
# 2.图片首页地址
pageUrl = 'https://www.umei.cc/katongdongman/dongmantupian/'
# 3.向图片首页地址发送get请求
res = requests.get(pageUrl)
# 4.指定合适的字符编码
res.encoding = 'UTF-8'
# 5.构造html解析器
soup = BeautifulSoup(res.text, 'lxml')
# 6.筛选图片所在的页面布局标签
divTag = soup.find(name='div', attrs={'class': 'TypeList'})
# 7.筛选页面布局下的列表标签
liList = divTag.find_all(name='li')
# 8.获取每个a标签的href属性
imgDetailTag = [li.a.get('href') for li in liList]
# 9.将每个href属性值补全成完整网址(图片详情页)
imgDetailUrlList = ['https://www.umei.cc'+imgDetailUrl for imgDetailUrl in imgDetailTag]
# 10.循环图片详情页
for imgDetail in imgDetailUrlList:
    # 11.向图片详情页发送请求
    res1 = requests.get(imgDetail)
    # 12.对图片详情页构造html解析器
    soupD = BeautifulSoup(res1.text, 'lxml')
    # 13.获取img标签
    imgBigTag = soupD.select('div.ImageBody img')
    # 14.select返回结果需要循环,获取图片链接
    for imgBig in imgBigTag:
        # 15.设置时间延迟
        time.sleep(1)
        print(imgBig.get('src'))
        # 16.向大图链接发送请求
        img = requests.get(imgBig.get('src'), stream=True)
        # 17.拼接文件路径
        filePath = os.path.join(r'动漫图片', imgBig.get('src').split('/')[-1])
        # 18.保存图片
        with open(filePath, 'wb') as f:
            for line in img.iter_content():
                f.write(line)
View Code
  • 爬取梨视频汽车视频数据

# 引入发送网络请求的模块
import requests
# 引入处理HTML文件的模块
from bs4 import BeautifulSoup
# 引入文件操作模块
import os
# 引入时间模块
import time

# 1.判断存放视频的目录是否存在,不存在则自动创建
if not os.path.exists(r'梨视频_Car'):
    os.mkdir(r'梨视频_Car')

def getVideo(n):
    """
        获取梨视频汽车板块全部视频方法
        参数n : 起始视频索引
    """
    # 1.梨视频汽车板块和主页的url
    carUrl = 'https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=31&start={}'.format(n)
    baseUrl = 'https://www.pearvideo.com/'
    # 2.向梨视频汽车板块发送get请求
    carRes = requests.get(carUrl)
    # 3.针对梨视频汽车板块的网页构造html解析器
    carSoup = BeautifulSoup(carRes.text, 'lxml')
    # 4.获取所有存放视频的li标签
    liList = carSoup.find_all(name='li', attrs={'class': 'categoryem'})
    # 5.获取a标签的href值,同时也是视频编号
    videoDetailList = [li.a.get('href') for li in liList]
    # 6.循环视频编号
    for video in videoDetailList:
        # 主动延迟
        time.sleep(1)
        # 7.获取视频编号
        videoCode = video
        # 8.获取视频id
        videoId = videoCode.split('_')[-1]
        # 9.向视频链接发送请求
        videoRes = requests.get('https://www.pearvideo.com/videoStatus.jsp',
                                params={'contId': videoId},
                                headers={'referer': baseUrl + videoCode}
                                )
        # 9.将返回结果反序列化
        dataJson = videoRes.json()
        # 10.获取视频链接
        srcUrl = dataJson.get('videoInfo').get('videos').get('srcUrl')
        # 11.需要获取真实链接
        realUrl = srcUrl.replace(dataJson.get('systemTime'), 'cont-{}'.format(videoId))
        # 12.向真实视频链接发送请求
        realVideoRes = requests.get(realUrl, stream=True)
        # 13.拼接文件路径
        filePath = os.path.join(r'梨视频_Car', '{}.mp4'.format(videoId))
        # 14.以写模式打开文件
        with open(filePath, 'wb') as f:
            # 16.按行读取视频
            for line in realVideoRes.iter_content():
                f.write(line)
        print('视频{}下载成功!!!'.format(videoId))

"""调用此方法"""
for n in range(12, 48, 12):
    getVideo(n)
View Code
  • 爬取豆瓣电影top250

import time
from openpyxl import Workbook
import requests
from bs4 import BeautifulSoup
import re


def getMovies(n, ws):
    """
        获得豆瓣电影top250
        参数 n: 页码
    """
    # 1.指定基础网址
    baseUrl = 'https://movie.douban.com/top250?start={}'.format(n * 25)
    # 2.发送get请求获得豆瓣电影top250首页
    res = requests.get(baseUrl,
                        headers={
                            'referer': 'https://movie.douban.com/top250?start=0',
                            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'
                        })
    # 3.构造针对豆瓣电影top250首页的解析器
    soup = BeautifulSoup(res.text, 'lxml')
    # 4.获取电影列表的祖先标签 class为item的div标签
    divItemTags = soup.select('div.item')
    # 5.循环存放电影的li标签
    for movie in divItemTags:
        time.sleep(1)
        # 6.获取电影名称
        title = movie.span.text
        # 7.获取电影导演和主演混合的文本
        dmText = movie.select('div.bd')[0].p.text
        # 8.获取导演姓名
        director = re.findall('导演: (.*?) ', dmText)[0]
        # 9.获取主演姓名(可能为空)
        mainActor = ''
        if len(re.findall('主演: (.*?) ', dmText)) > 0:
            mainActor = re.findall('主演: (.*?) ', dmText)[0]
        # 10.获取评分
        ratingNum = movie.select('span.rating_num')[0].text
        # 11.获取评价人数
        ratingCount = movie.select('div.star span')[3].text
        # 12.获取座右铭(可能为空)
        motto = ''
        if len(movie.select('p.quote>span.inq')) > 0:
            motto = movie.select('p.quote>span.inq')[0].text
        # 13.将电影相关信息添加至excel文件相关表末尾
        ws.append([title, director, mainActor, ratingNum, ratingCount, motto])


"""爬取电影排行"""
# 1.新建excel文件对象
wbMovie = Workbook()
# 2.创建工作表
ws250 = wbMovie.create_sheet('豆瓣电影top250')
# 3.定义表头
ws250.append(['电影名称', '导演姓名', '主演姓名', '评分', '评价人数', '座右铭'])
# 4.输入需要的页数
pageNum = int(input('想看几页的电影排行:').strip())
# 5.调用方法
for page in range(pageNum):
    getMovies(int(page), ws250)
# 6.保存表格文件
wbMovie.save(r'豆瓣电影top250_{}.xlsx'.format(time.strftime('%Y-%m-%d')))
View Code
  • 爬取链接二手房数据

import time
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook

# 1.创建Excel表格文件
wbHouse = Workbook()
# 2.创建工作表
ws1 = wbHouse.create_sheet('某地区二手房', 0)
ws1.append(['房屋名称', '详情链接', '小区名称', '区域名称',
            '详细信息',
            '关注人数', '发布时间', '总价(万元)', '单价(元/平)'])

def handleInfo(info):
     """
         分割详细信息
         户型,大小,朝向,装修程度,楼层,年代,楼型
     """
     details = info.split('|').strip()
     if not len(details) == 7:
         details[0] = info
 
     return details

def getTwoHandHouse(city, area, n):
    """
            获取特定地区房屋信息
            房屋名称,详情链接,小区名称,区域名称,详细信息(可拆分),关注人数,发布时间,总价,单价
        """
    # 1.指定网站url
    twoHandUrl = 'https://{}.lianjia.com/ershoufang/{}/pg{}/'.format(city, area, n)
    # 2.定义请求头
    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"
    }
    # 3.发送请求
    resBS = requests.get(twoHandUrl, headers=headers)
    # 4.利用解析库筛选数据
    soup = BeautifulSoup(resBS.text, 'lxml')
    # 5.找到显示房屋信息的列表
    houseList = soup.select('ul.sellListContent>li')
    # 6.循环当页所有房屋
    for house in houseList:
        # 1.获取存放名称、链接的a标签
        aTag = house.select('div.title>a')[0]
        if not aTag:
            continue
        # 获取房屋名称
        houseName = aTag.text
        # 获取详情链接
        link = aTag.get('href')
        # 2.获取存放小区、地区的div标签
        divPosiTag = house.select('div.positionInfo')[0]
        posi = divPosiTag.text.split('-')
        # 根据是否有不可分割的位置信息,做不同处理
        if len(posi) == 2:
            estateName = posi[0]
            estateArea = posi[1]
        elif len(posi) == 1:
            estateName, estateArea = posi[0]
        else:
            estateName, estateArea = ''
        # 3.获取存放详细信息的div标签
        divInfoTag = house.select('div.houseInfo')[0]
        # 获取详细信息
        info = divInfoTag.text
        # 分割详细信息
        # detail =handleInfo(info)
        # 4.获取关注度与发布时间的div标签
        divFollowTag = house.select('div.followInfo')[0]
        focusTime = divFollowTag.text
        # 获取关注人数
        peopleNum = focusTime.split('/')[0].strip()
        # 获取发布时间(多少天以前)
        publishTime = focusTime.split('/')[1].strip()
        # 5.获取总价标签
        divTotalTag = house.select('div.totalPrice')[0]
        # 获取总价
        totalPrice = divTotalTag.span.text
        # 6.获取单价标签
        divUnitTag = house.select('div.unitPrice')[0]
        # 获取单价
        unitPrice = divUnitTag.text.strip('元/平')
        ''' 主动延迟 '''
        time.sleep(1)
        # 7.将数据添加至Excel表格文件
        ws1.append([houseName, link, estateName, estateArea, info,
                   peopleNum, publishTime, totalPrice, unitPrice])

num = int(input('请输入需要的二手房页数: ').strip())
# 按页获取二手房
for n in range(1, num+1):
    getTwoHandHouse('sh', 'baoshan', n)
    print('第{}页获取完成'.format(n))

# 保存文件
wbHouse.save(r'二手房.xlsx')
View Code
  • 爬取汽车之家新闻数据

import os
import time
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook

# 1.创建Excel表格文件
wbCar = Workbook()
# 2.创建工作表
ws1 = wbCar.create_sheet('汽车之家新闻', 0)
ws1.append(['标题', '详情链接', '图标', '发布时间', '简介'])

if not os.path.exists('车闻详情'):
    os.mkdir(r'车闻详情')

def getCarNews(n):
    """
        获取汽车之家新闻相关信息
        标题、链接、图标、发布时间、简介
    """
    # 1.指定汽车之家新闻网的链接
    carNewsUrl = 'https://www.autohome.com.cn/news/{}/#liststart'.format(n)
    # 2.定义请求头
    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"
    }
    # 2.向汽车之家发送请求
    carRes = requests.get(carNewsUrl, headers=headers)
    # 3.避免乱码,按照响应设置字符编码
    carRes.encoding = 'GBK'
    # 4.构造html文件解析器
    carSoup = BeautifulSoup(carRes.text, 'lxml')
    # 5.先查找存放新闻信息的li标签
    newsList = carSoup.select("ul.article>li")
    for news in newsList:
        # 1.获取链接
        aTag = news.find('a')
        if not aTag:
            continue
        link = 'https:' + aTag.get('href')
        # 2.获取标题
        if not aTag.find('h3'):
            continue
        title = aTag.find('h3').text
        # 3.获取发布时间
        if not aTag.select('span.fn-left'):
            continue
        pubTime = aTag.select('span.fn-left')[0].text
        # 4.获取图标
        img = ''
        if aTag.find('img'):
            img = 'https:' + aTag.find('img').get('src')
        # 5.获取简介
        desc = ''
        if aTag.find('p'):
            desc = aTag.find('p').text
        # 6.获取详情
        newsRes = requests.get(link, headers=headers)
        article = newsRes.text
        filePath = os.path.join('车闻详情', r'{}.html'.format(title))
        # 7.保存至html文件
        try:
            with open(filePath, 'w', encoding='UTF-8') as f:
                f.write(article)
        except Exception:
            print(title)
        # .将数据添加到Excel表格文件
        ws1.append([title, link, img, pubTime, desc])
        # 主动延迟
        time.sleep(1)


# 输入想要获取的新闻数目
pageNum = int(input('请输入想要获取的汽车新闻的数量(页): ').strip())
# 按页获取新闻
for n in range(1, pageNum+1):
    # 调用爬取汽车之家新闻信息的函数
    getCarNews(n)
# 保存文件
wbCar.save(r'车闻.xlsx')
View Code
  • 爬取城市名称

import requests
from lxml import etree

# 1.基础链接
cityUrl = 'https://www.aqistudy.cn/historydata/'
# 2.发送请求
cityRes = requests.get(cityUrl,
                       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'}
                       )
# 3.生成xpath对象
cityHtml = etree.HTML(cityRes.text)
# 4.获取热门城市名称列表
hotCityList = cityHtml.xpath('//div[@class="hot"]/div[2]/ul/li/a/text()')
# print(hotCityList)
# 5.获取全部城市名称列表
allCityList = cityHtml.xpath('//div[@class="all"]/div[2]/ul/div[2]/li/a/text()')
# print(allCityList)
# 6.获取该页面全部城市名称
allCityNames = cityHtml.xpath(
    '//div[@class="hot"]/div[2]/ul/li/a/text() | //div[@class="all"]/div[2]/ul/div[2]/li/a/text()')
print(allCityNames)
View Code
  • 爬取猪八戒

import requests
from lxml import etree
from openpyxl import Workbook

# 1.创建Excel表格文件对象
wbWork = Workbook()
ws1 = wbWork.create_sheet('工作内容', 0)
ws1.append(['公司名称', '地址', '工作内容描述', '订单价格', '历史成交量(近半年)'])


def getWork(kw):
    """
        获取工作相关订单信息
    """
    # 1.设置网页基本链接
    workUrl = 'https://shanghai.zbj.com/search/f'
    # 2.发送请求获取页面数据
    workRes = requests.get(workUrl,
                           params={'kw': kw}
                           )
    # 3.生成xpath对象
    workHtml = etree.HTML(workRes.text)
    '''直接查找很多时候是无法使用的 因为会出现数据混乱的现象'''
    # companyName = workHtml.xpath('//div[@class="new-service-wrap"]/div/div/div/a/div[1]/p/text()')
    # print(companyName)
    # 4.先查找所有含有数据的div,再依次循环
    divList = workHtml.xpath('//div[@class="new-service-wrap"]/div')
    # 5.循环工作订单信息
    for div in divList:
        # 6.获取公司名称
        companyName = div.xpath('./div/div/a/div[1]/p/text()')
        # 7.发现有广告位,名称列表存在空值,添加判断
        if not companyName:
            continue
        # 8.去列表末位去除空格获取公司名称
        cName = companyName[-1].strip()
        # 9.获取公司地址
        addressInfo = div.xpath('./div/div/a/div[1]/div/span/text()')[0]
        # 10.获取订单价格
        price = div.xpath('./div/div/a[2]/div[2]/div[1]/span[1]/text()')[0]
        # 11.获取成交量
        amount = div.xpath('./div/div/a[2]/div[2]/div[1]/span[2]/text()')[0].strip('近半年成交:')
        # 12.工作内容
        desc = div.xpath('./div/div/a[2]/div[2]/div[2]/p//text()')
        # print(''.join(desc))
        # 13.添加至Excel表格
        ws1.append([cName, addressInfo, ''.join(desc), price, amount])


# 输入搜索关键字
kw = input('请输入工作内容: ').strip()
# 调用方法
getWork(kw)
wbWork.save('{}工作订单.xlsx'.format(kw))
View Code
  • 爬取贴吧图片

import time
import os
import requests
from lxml import etree



def getTiebaImg(tName, pageNum):
    """
        获取贴吧图片
        tName: 贴吧名
    """
    # 1.设置搜索基础地址和贴吧地址
    searchUrl = 'https://tieba.baidu.com/f'
    baseUrl = 'https://tieba.baidu.com'
    # 2.发送请求
    # TODO:多页数据 只需要再加一个pn参数即可
    tRes = requests.get(searchUrl,
                        params={'kw': tName,
                                'pn': (pageNum-1) * 50
                                }
                        )
    # 3.利用响应文本生成xpath对象
    tHtml = etree.HTML(tRes.text)
    # print(tRes.text)
    # 4.循环帖子链接,拼接成完整地址,再向每个帖子发送请求
    aLinkList = tHtml.xpath('//a[@class="j_th_tit "]/@href')
    for link in aLinkList:
        fullLink = baseUrl + link
        # 5.向帖子发送请求
        tieRes = requests.get(fullLink)
        tieHtml = etree.HTML(tieRes.text)
        # 6.获取图片链接
        imgSrcList = tieHtml.xpath('//img[@class="BDE_Image"]/@src')
        print(imgSrcList)
        """主动延迟"""
        time.sleep(2)
        for imgSrc in imgSrcList:
            # 7.向图片地址发送请求
            imgRes = requests.get(imgSrc)
            # 8.拼接文件路径并保存
            filePath = os.path.join(tiebaName, imgSrc[-16:])
            with open(filePath, 'wb') as f:
                f.write(imgRes.content)
                print('{}下载完成'.format(imgSrc[-16:]))
            """主动延迟"""
            time.sleep(1)



# 获取用户想要爬取的贴吧名称、页数
tiebaName = input('请输入你想要获得哪个贴吧的图片: ').strip()
pn = int(input('请输入你想要搜索的页数: ').strip())

# 判断是否存在名称为当前贴吧名称的文件夹
if not os.path.exists(tiebaName):
    os.mkdir(tiebaName)
# 调用函数
for n in range(1, pn + 1):
    getTiebaImg(tiebaName, pn)
View Code
  • 百度自动登录

1、用户名密码登录

from selenium import webdriver
import time


# 1.指定操作的浏览器驱动(谷歌)
bro = webdriver.Chrome()
# 2.控制浏览器访问网站
bro.get('https://www.baidu.com')

# 3.获取登录链接标签
loginTag = bro.find_element_by_id('s-top-loginbtn')
# 4.点击登录链接
loginTag.click()
# 5.一般弹出窗口都是悬浮窗口
# 该页面登录框不是由悬浮窗口构成,这里直接查找即可
# bro.switch_to.frame('iframeResult')
'''延迟等待:页面数据有时候需要时间加载 但是代码不会自动等'''
time.sleep(3)
# 6.获取用户名以及密码输入框
userName = bro.find_element_by_id('TANGRAM__PSP_11__userName')
password = bro.find_element_by_id('TANGRAM__PSP_11__password')
# 7.书写用户名和密码
userName.send_keys('正确的用户名')
password.send_keys('正确的密码')
# 8.获取登录按钮
loginBtn = bro.find_element_by_id('TANGRAM__PSP_11__submit')
# 9.点击登录按钮
loginBtn.click()
# 10.延迟并关闭
time.sleep(15)
bro.close()
View Code

2、短信验证码登录

from selenium import webdriver
import time

# 1.使用谷歌浏览器访问百度首页
bro = webdriver.Chrome()
bro.get('https://www.baidu.com/')
# 2.查找页面上的登录按钮
login_tag = bro.find_element_by_id('s-top-loginbtn')
# 3.点击登录按钮
time.sleep(0.5)
login_tag.click()
time.sleep(3)
# 4.查找点击短信登录按钮
message_tag = bro.find_element_by_id('TANGRAM__PSP_11__changeSmsCodeItem')
message_tag.click()
time.sleep(0.5)
# 5.查找手机号输入框并填写内容
phone_tag = bro.find_element_by_id('TANGRAM__PSP_11__smsPhone')
phone_tag.send_keys(18818188888)
time.sleep(0.5)
# 6.查找发送验证码按钮并点击
btn_tag = bro.find_element_by_id('TANGRAM__PSP_11__smsTimer')
btn_tag.click()
time.sleep(0.5)
# 7.查找并点击登录按钮
submit_tag = bro.find_element_by_id('TANGRAM__PSP_11__smsSubmit')
submit_tag.click()
time.sleep(0.5)
# 8.关闭浏览器
bro.close()
View Code
  • 爬取京东商品数据

import time

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

bro = webdriver.Chrome()
# 1.访问京东首页
bro.get('https://www.jd.com/')
bro.implicitly_wait(10)  # 延时等待
# 2.查找搜索款并输入商品名称
search_input = bro.find_element_by_id('key')
search_input.send_keys('高达')
# 3.按下enter键进入商品展示页
search_input.send_keys(Keys.ENTER)

# 由于数据存在滚动加载的现象
for i in range(0, 8000, 1000):  # 千万不能直接到底 一定要有一个波段
    bro.execute_script('window.scrollTo(0,%s)' % i)
    time.sleep(0.5)

good_list = bro.find_elements_by_css_selector('li.gl-item')
# 循环获取每一个li标签 筛选所需数据
for li in good_list:
    # 图标标签的src属性
    img_tag = li.find_element_by_css_selector('div.p-img a img')
    img_src = img_tag.get_attribute('src')
    '''img标签的src属性存在懒加载现象 src没有就在data-lazy-img属性下'''
    if not img_src:
        img_src = 'https:' + img_tag.get_attribute('data-lazy-img')
    # 商品价格
    price_tag = li.find_element_by_css_selector('div.p-price strong')
    order_price = price_tag.text
    # 商品描述
    desc_tag = li.find_element_by_css_selector('div.p-name a em')
    order_desc = desc_tag.text
    # 商品链接
    link_tag = li.find_element_by_css_selector('div.p-name a')
    order_link = link_tag.get_attribute('href')
    # 商品销量
    commit_tag = li.find_element_by_css_selector('div.p-commit strong a')
    order_commit = commit_tag.text
    # 店铺名称
    shop_tag = li.find_element_by_css_selector('div.p-shop span a')
    shop_name = shop_tag.text
    # 店铺链接
    shop_link = shop_tag.get_attribute('href')
    # 通过打印展示数据 也可以数据持久化到表格文件
    print("""
    商品描述:%s
    商品价格:%s
    商品图片:%s
    商品链接:%s
    店铺名称:%s
    店铺链接:%s
    """ % (order_desc, order_price, img_src, order_link, shop_name, shop_link))
# 关闭浏览器
bro.close()
View Code

 

posted @ 2021-10-07 20:27  Leguan001  阅读(759)  评论(0)    收藏  举报