day3、爬取素材網(wǎng)圖片-bs4使用-智聯(lián)抓取信息-chromedriver

1、爬取素材網(wǎng)圖片

import urllib.request
from lxml import etree
import os

# 定義一個(gè)函數(shù)將url和頁(yè)面序號(hào)處理成請(qǐng)求對(duì)象
def handle_url(url,page):
    # 處理url字符串
    if page == 1:
        page_url = url + ".html"
    else:
        page_url = url + "_"+str(page) + ".html"
    # 處理請(qǐng)求頭
    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'}
    # 創(chuàng)建請(qǐng)求對(duì)象
    req = urllib.request.Request(url=page_url,headers=headers)

    return req

# 定義一個(gè)函數(shù)用請(qǐng)求對(duì)象發(fā)起請(qǐng)求并且得出響應(yīng)結(jié)果
def request_sucai(req):
    # 發(fā)起請(qǐng)求
    res = urllib.request.urlopen(req)
    html = res.read().decode("utf-8")
    # print(html)
    # 解析html頁(yè)面,得到素材圖片url列表
    html_tree = etree.HTML(html)# 把html字符串加載到etree中,轉(zhuǎn)化成一個(gè)層級(jí)結(jié)構(gòu)
    # 接下來(lái)在html_tree中提取出我們想要的內(nèi)容
    img_list = html_tree.xpath("http://div[starts-with(@class,'box')]/div//img/@src2")
    # 這里有一個(gè)反爬:隱藏屬性在源碼用src2代替了src
    # print(img_list)
    return img_list

# 定義一個(gè)函數(shù)用圖片的url列表下載圖片
def download_imgs(img_url_list):
    # 遍歷url列表
    for url in img_url_list:
        # 生成圖片存儲(chǔ)的路徑名
        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
        # 拼接處圖片存儲(chǔ)路徑
        filename = dirpath + img_name + suffix
        print(filename)
        # 下載圖片
        print("當(dāng)前正在下載:"+url)
        urllib.request.urlretrieve(url=url,filename=filename)



# 定義main函數(shù),處理業(yè)務(wù)邏輯
def main():
    url = "http://sc.chinaz.com/tupian/meinvxiezhen"
    # 輸入起始頁(yè)
    start_page = input("請(qǐng)求輸入起始頁(yè):")
    # 請(qǐng)輸入終止頁(yè)
    end_page = input("請(qǐng)輸入終止頁(yè):")
    # 從起始頁(yè)遍歷到終止頁(yè)
    print("開(kāi)始下載...")
    for i in range(int(start_page),int(end_page)+1):
        # 處理頁(yè)面的url
        req = handle_url(url,i)
        # 發(fā)起請(qǐng)求
        sucai_list = request_sucai(req)
        # 下載素材列表中的url對(duì)應(yīng)的素材
        download_imgs(sucai_list)
    print("下載完畢!")

if __name__ == "__main__":
    main()

2、bs4使用

from bs4 import BeautifulSoup

# bs4主要用于解析網(wǎng)頁(yè),在解析的的時(shí)候主要是按照css選擇器的規(guī)則來(lái)選取網(wǎng)頁(yè)上的元素

# 創(chuàng)建一個(gè)bs4對(duì)象
soup = BeautifulSoup(open("./soup_test.html",encoding="utf-8"),"lxml")
# 參數(shù)1,代表我們要解析的那個(gè)html字符串  參數(shù)2,代表一個(gè)本地解析器(這個(gè)解析器可以增加bs4的解析速度)
# print(soup)

# 1、根據(jù)標(biāo)簽名查找對(duì)象,返回的是這一類標(biāo)簽的第一個(gè)
print(soup.title)
print(soup.li)

# 2、獲取節(jié)點(diǎn)的屬性值
obj_a = soup.a
print(obj_a.get("title")) # 用get函數(shù)
print(obj_a["href"]) # 用[]獲取
print(obj_a.attrs) # 獲取obj_a所有屬性
print(obj_a.name) # 獲取標(biāo)簽名

# 3、獲取標(biāo)簽中的內(nèi)容
print(obj_a.string) # string屬性代表標(biāo)簽內(nèi)容中字符串(包含被注釋掉的那些部分)
print(obj_a.get_text()) # get_text()獲取內(nèi)容的時(shí)候,會(huì)自動(dòng)把注釋內(nèi)容剔除掉

# 4、獲取子節(jié)點(diǎn)
# 1) 獲取直接的子節(jié)點(diǎn)
print(soup.body.children) # 用children屬性把獲取到的子節(jié)點(diǎn)放入一個(gè)迭代器中
# print(soup.body.contents[1]) # 用contents屬性獲取到是一個(gè)列表,列表存放所有的子節(jié)點(diǎn)
# 2) 獲取所有的后代節(jié)點(diǎn)
print(soup.body.descendants)
# for i in soup.body.descendants:
#     print(i)

# 5、根據(jù)相關(guān)的函數(shù)來(lái)查找
# 1) find函數(shù),返回的是一個(gè)對(duì)象
print("=================================")
print(soup.find("a"))
print(soup.find("a",id="hong"))

# 2) find_all 函數(shù),返回的是一個(gè)列表
print(soup.find_all("a"))
print(soup.find_all(["a","span",'li'],class_="taohua"))
print(soup.find_all(["a","span","li"],limit=3)) # 找前三個(gè)
# 3) select函數(shù),根據(jù)css選擇器來(lái)查找
print(soup.select(".tang ul li"))
print(soup.select("div.tang"))

3、智聯(lián)抓取信息

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

# 定義一個(gè)爬蟲(chóng)類
class ZhilianSpider(object):
    # 重寫構(gòu)造方法
    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'}

    # 定義一個(gè)成員方法,用于處理url
    def handle_url(self,page):
        # jl=%E6%B7%B1%E5%9C%B3&kw=python&p=1
        # 處理url,初始url就是self.url
        # 處理請(qǐng)求體
        data = {
            "jl":self.area,
            "kw":self.job,
            "p":page
        }
        # 將data處理成參數(shù)
        data = urllib.parse.urlencode(data)
        # get請(qǐng)求的請(qǐng)求體需要拼接url后面
        url = self.url + data
        # print(url)
        # 創(chuàng)建請(qǐng)求對(duì)象
        req = urllib.request.Request(url=url,headers=self.headers)
        return req


    # 定義一個(gè)成員方法,用于請(qǐng)求網(wǎng)頁(yè)
    def request_jobs(self,req):
        # 發(fā)起一個(gè)請(qǐng)求
        res = urllib.request.urlopen(req)

        return res.read()

    # 定義一個(gè)方法,用于解析響應(yīng)結(jié)果
    def hanlde_res(self,content):
        # 把content初始化成一個(gè)bs4對(duì)象
        soup = BeautifulSoup(content,"lxml")
        # print(soup)
        # 選取所有的職務(wù)信息
        job_list = soup.select(".newlist")[1:]
        # print(job_list)
        # 遍歷所有的職務(wù)信息,從中找出我們所需要的
        for job in job_list:
            # 職務(wù)名稱
            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)
            # 工作地點(diǎn)
            gzdd = job.select(".gzdd")[0].get_text()

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

            yield item

    # 封裝一個(gè)本類的對(duì)外接口,用于處理類內(nèi)部的業(yè)務(wù)邏輯
    def start_crawl(self):
        # 定義一個(gè)列表用于存儲(chǔ)所有的頁(yè)面的職位信息
        jobItems = []
        # 從start遍歷到end
        for page in range(int(self.start),int(self.end)+1):
            # 創(chuàng)建請(qǐng)求對(duì)象
            req = self.handle_url(page)
            # 發(fā)起請(qǐng)求
            res = self.request_jobs(req)
            # 解析網(wǎng)頁(yè)
            items = self.hanlde_res(res) # 每解析一個(gè)頁(yè)面就會(huì)得到這個(gè)頁(yè)面提取的職位信息構(gòu)造生成器
            # 迭代items提取出其中的職位信息,并整合到j(luò)obItems中去
            for item in items:
                jobItems.append(item)
        print(jobItems)
        # 把jobItems寫入json數(shù)據(jù)中
        with open("zhilian.json",'w') as fp:
            fp.write(json.dumps(jobItems))

# 在類的外部定義個(gè)main函數(shù)用于處理整個(gè)爬蟲(chóng)的業(yè)務(wù)邏輯
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("地點(diǎn):")
    start = input("起始頁(yè):")
    end = input("終止頁(yè):")

    # 通過(guò)上面的輸入,獲取到了類的成員變量對(duì)應(yīng)的具體值,接下來(lái)初始化爬蟲(chóng)類
    zhi = ZhilianSpider(url=url,area=area,job=jobs,start=start,end=end)
    # 讓爬蟲(chóng)類調(diào)用自己的對(duì)外接口方法,處理其內(nèi)部的業(yè)務(wù)邏輯
    zhi.start_crawl()
if __name__ == "__main__":
    main()

4、jsonpath(了解)

import json
import jsonpath

# 導(dǎo)入一個(gè)json文件
obj = json.load(open("./book.json",'r',encoding='utf-8'))
# print(obj)
# jsonpath的作用:用來(lái)解析json字符串,可以很快速?gòu)囊粋€(gè)非常復(fù)雜的json字符串中篩選你想要的內(nèi)容
# "$"表示根,"."代表當(dāng)前的子節(jié)點(diǎn),".."代表后代節(jié)點(diǎn)
ret = jsonpath.jsonpath(obj,"$.store.book[*].author")
ret = jsonpath.jsonpath(obj,"$..author")
ret = jsonpath.jsonpath(obj,"$..book[1:]")
print(ret)

5、chromedriver使用

# 從selenium中導(dǎo)入瀏覽器驅(qū)動(dòng)
from selenium import webdriver

# 創(chuàng)建一個(gè)webdriver對(duì)象
driver = webdriver.Chrome(r"C:\Users\fanjianbo\Desktop\chromedriver\chromedriver.exe")
# 用driver來(lái)操作chrome瀏覽器
driver.get("http://www.baidu.com/")

# 點(diǎn)擊設(shè)置按鈕
driver.find_elements_by_link_text("設(shè)置")[0].click()
# 搜索老王
driver.find_element_by_id("kw").send_keys("老王")
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 上網(wǎng)原理 1、爬蟲(chóng)概念 爬蟲(chóng)是什麼? 蜘蛛,蛆,代碼中,就是寫了一段代碼,代碼的功能從互聯(lián)網(wǎng)中提取數(shù)據(jù) 互聯(lián)網(wǎng): ...
    riverstation閱讀 8,606評(píng)論 1 2
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,511評(píng)論 19 139
  • 1. 畫(huà)面精簡(jiǎn),卻能營(yíng)造撤退行動(dòng)的壓迫氣氛 整部電影的對(duì)白不多,從最開(kāi)頭的幾位士兵在空蕩蕩的街頭行走,漫天飄散的勸...
    獵場(chǎng)君閱讀 570評(píng)論 0 2
  • 經(jīng)常接到咨詢要12864液晶模塊,當(dāng)我們業(yè)務(wù)確認(rèn)參數(shù)時(shí),很多客戶就會(huì)說(shuō)12864液晶屏不都是可以通用嗎?就是普通...
    馳宇微lcd液晶屏定制專家譚梅閱讀 1,258評(píng)論 0 1
  • 你常把“夢(mèng)想”掛在嘴邊,卻敗在不愿改變的懶惰上,你向往更好的生活,卻不愿跳出舒適區(qū)去爭(zhēng)取,要知道,每個(gè)夢(mèng)想的背后都...
    九洋閱讀 217評(píng)論 0 0

友情鏈接更多精彩內(nèi)容