day3、爬取素材网图片-bs4使用-智联抓取信息-chromedriver

1、爬取素材网图片

import urllib.request
from lxml import etree
import os

# 定义一个函数将url和页面序号处理成请求对象
def handle_url(url,page):
    # 处理url字符串
    if page == 1:
        page_url = url + ".html"
    else:
        page_url = url + "_"+str(page) + ".html"
    # 处理请求头
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
    # 创建请求对象
    req = urllib.request.Request(url=page_url,headers=headers)

    return req

# 定义一个函数用请求对象发起请求并且得出响应结果
def request_sucai(req):
    # 发起请求
    res = urllib.request.urlopen(req)
    html = res.read().decode("utf-8")
    # print(html)
    # 解析html页面,得到素材图片url列表
    html_tree = etree.HTML(html)# 把html字符串加载到etree中,转化成一个层级结构
    # 接下来在html_tree中提取出我们想要的内容
    img_list = html_tree.xpath("//div[starts-with(@class,'box')]/div//img/@src2")
    # 这里有一个反爬:隐藏属性在源码用src2代替了src
    # print(img_list)
    return img_list

# 定义一个函数用图片的url列表下载图片
def download_imgs(img_url_list):
    # 遍历url列表
    for url in img_url_list:
        # 生成图片存储的路径名
        dirpath = "./meinvxiezhen/"
        # 图片的名字
        suffix = os.path.splitext(url)[-1]
        # 取图片的名字
        img_name = os.path.splitext(url)[0].split("/")[-1]
        print(img_name)
        # http: // pic1.sc.chinaz.com / Files / pic / pic9 / 201709 / zzpic7097_s.jpg
        # 拼接处图片存储路径
        filename = dirpath + img_name + suffix
        print(filename)
        # 下载图片
        print("当前正在下载:"+url)
        urllib.request.urlretrieve(url=url,filename=filename)



# 定义main函数,处理业务逻辑
def main():
    url = "http://sc.chinaz.com/tupian/meinvxiezhen"
    # 输入起始页
    start_page = input("请求输入起始页:")
    # 请输入终止页
    end_page = input("请输入终止页:")
    # 从起始页遍历到终止页
    print("开始下载...")
    for i in range(int(start_page),int(end_page)+1):
        # 处理页面的url
        req = handle_url(url,i)
        # 发起请求
        sucai_list = request_sucai(req)
        # 下载素材列表中的url对应的素材
        download_imgs(sucai_list)
    print("下载完毕!")

if __name__ == "__main__":
    main()

2、bs4使用

from bs4 import BeautifulSoup

# bs4主要用于解析网页,在解析的的时候主要是按照css选择器的规则来选取网页上的元素

# 创建一个bs4对象
soup = BeautifulSoup(open("./soup_test.html",encoding="utf-8"),"lxml")
# 参数1,代表我们要解析的那个html字符串  参数2,代表一个本地解析器(这个解析器可以增加bs4的解析速度)
# print(soup)

# 1、根据标签名查找对象,返回的是这一类标签的第一个
print(soup.title)
print(soup.li)

# 2、获取节点的属性值
obj_a = soup.a
print(obj_a.get("title")) # 用get函数
print(obj_a["href"]) # 用[]获取
print(obj_a.attrs) # 获取obj_a所有属性
print(obj_a.name) # 获取标签名

# 3、获取标签中的内容
print(obj_a.string) # string属性代表标签内容中字符串(包含被注释掉的那些部分)
print(obj_a.get_text()) # get_text()获取内容的时候,会自动把注释内容剔除掉

# 4、获取子节点
# 1) 获取直接的子节点
print(soup.body.children) # 用children属性把获取到的子节点放入一个迭代器中
# print(soup.body.contents[1]) # 用contents属性获取到是一个列表,列表存放所有的子节点
# 2) 获取所有的后代节点
print(soup.body.descendants)
# for i in soup.body.descendants:
#     print(i)

# 5、根据相关的函数来查找
# 1) find函数,返回的是一个对象
print("=================================")
print(soup.find("a"))
print(soup.find("a",id="hong"))

# 2) find_all 函数,返回的是一个列表
print(soup.find_all("a"))
print(soup.find_all(["a","span",'li'],class_="taohua"))
print(soup.find_all(["a","span","li"],limit=3)) # 找前三个
# 3) select函数,根据css选择器来查找
print(soup.select(".tang ul li"))
print(soup.select("div.tang"))

3、智联抓取信息

import urllib.request
from bs4 import BeautifulSoup
import urllib.parse
import json

# 定义一个爬虫类
class ZhilianSpider(object):
    # 重写构造方法
    def __init__(self,url,job,area,start,end):
        self.url = url
        self.job = job
        self.area = area
        self.start = start
        self.end = end
        self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}

    # 定义一个成员方法,用于处理url
    def handle_url(self,page):
        # jl=%E6%B7%B1%E5%9C%B3&kw=python&p=1
        # 处理url,初始url就是self.url
        # 处理请求体
        data = {
            "jl":self.area,
            "kw":self.job,
            "p":page
        }
        # 将data处理成参数
        data = urllib.parse.urlencode(data)
        # get请求的请求体需要拼接url后面
        url = self.url + data
        # print(url)
        # 创建请求对象
        req = urllib.request.Request(url=url,headers=self.headers)
        return req


    # 定义一个成员方法,用于请求网页
    def request_jobs(self,req):
        # 发起一个请求
        res = urllib.request.urlopen(req)

        return res.read()

    # 定义一个方法,用于解析响应结果
    def hanlde_res(self,content):
        # 把content初始化成一个bs4对象
        soup = BeautifulSoup(content,"lxml")
        # print(soup)
        # 选取所有的职务信息
        job_list = soup.select(".newlist")[1:]
        # print(job_list)
        # 遍历所有的职务信息,从中找出我们所需要的
        for job in job_list:
            # 职务名称
            zwmc = job.select(".zwmc > div > a")[0].get_text()
            # print(zwmc)
            # 公司名称
            gsmc = job.select(".gsmc > a")[0].get_text()
            # print(gsmc)
            # 薪资
            zwyx = job.select(".zwyx")[0].get_text()
            print(zwyx)
            # 工作地点
            gzdd = job.select(".gzdd")[0].get_text()

            # 整合信息
            item = {"zwmc":zwmc,"gsmc":gsmc,"zwyx":zwyx,"gzdd":gzdd}

            yield item

    # 封装一个本类的对外接口,用于处理类内部的业务逻辑
    def start_crawl(self):
        # 定义一个列表用于存储所有的页面的职位信息
        jobItems = []
        # 从start遍历到end
        for page in range(int(self.start),int(self.end)+1):
            # 创建请求对象
            req = self.handle_url(page)
            # 发起请求
            res = self.request_jobs(req)
            # 解析网页
            items = self.hanlde_res(res) # 每解析一个页面就会得到这个页面提取的职位信息构造生成器
            # 迭代items提取出其中的职位信息,并整合到jobItems中去
            for item in items:
                jobItems.append(item)
        print(jobItems)
        # 把jobItems写入json数据中
        with open("zhilian.json",'w') as fp:
            fp.write(json.dumps(jobItems))

# 在类的外部定义个main函数用于处理整个爬虫的业务逻辑
def main():
    url = "https://sou.zhaopin.com/jobs/searchresult.ashx?"
    #jl=%E6%B7%B1%E5%9C%B3&kw=python&p=1
    jobs = input("岗位:")
    area = input("地点:")
    start = input("起始页:")
    end = input("终止页:")

    # 通过上面的输入,获取到了类的成员变量对应的具体值,接下来初始化爬虫类
    zhi = ZhilianSpider(url=url,area=area,job=jobs,start=start,end=end)
    # 让爬虫类调用自己的对外接口方法,处理其内部的业务逻辑
    zhi.start_crawl()
if __name__ == "__main__":
    main()

4、jsonpath(了解)

import json
import jsonpath

# 导入一个json文件
obj = json.load(open("./book.json",'r',encoding='utf-8'))
# print(obj)
# jsonpath的作用:用来解析json字符串,可以很快速从一个非常复杂的json字符串中筛选你想要的内容
# "$"表示根,"."代表当前的子节点,".."代表后代节点
ret = jsonpath.jsonpath(obj,"$.store.book[*].author")
ret = jsonpath.jsonpath(obj,"$..author")
ret = jsonpath.jsonpath(obj,"$..book[1:]")
print(ret)

5、chromedriver使用

# 从selenium中导入浏览器驱动
from selenium import webdriver

# 创建一个webdriver对象
driver = webdriver.Chrome(r"C:\Users\fanjianbo\Desktop\chromedriver\chromedriver.exe")
# 用driver来操作chrome浏览器
driver.get("http://www.baidu.com/")

# 点击设置按钮
driver.find_elements_by_link_text("设置")[0].click()
# 搜索老王
driver.find_element_by_id("kw").send_keys("老王")
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 上网原理 1、爬虫概念 爬虫是什麽? 蜘蛛,蛆,代码中,就是写了一段代码,代码的功能从互联网中提取数据 互联网: ...
    riverstation阅读 12,671评论 1 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,224评论 19 139
  • 1. 画面精简,却能营造撤退行动的压迫气氛 整部电影的对白不多,从最开头的几位士兵在空荡荡的街头行走,漫天飘散的劝...
    猎场君阅读 3,505评论 0 2
  • 经常接到咨询要12864液晶模块,当我们业务确认参数时,很多客户就会说12864液晶屏不都是可以通用吗?就是普通...
  • 你常把“梦想”挂在嘴边,却败在不愿改变的懒惰上,你向往更好的生活,却不愿跳出舒适区去争取,要知道,每个梦想的背后都...
    九洋阅读 1,472评论 0 0

友情链接更多精彩内容