1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        盤點一個網絡爬蟲中常見的一個錯誤

        共 3560字,需瀏覽 8分鐘

         ·

        2022-04-19 09:53

        點擊上方“Python爬蟲與數據挖掘”,進行關注

        回復“書籍”即可獲贈Python從入門到進階共10本電子書

        圣朝無闕事,自覺諫書稀。

        大家好,我是皮皮。

        一、前言

        前幾天在Python白銀交流群有個叫【雨就是雨】的粉絲問了一個Python網絡爬蟲的問題,這里拿出來給大家分享下,一起學習下。

        問題如下:

        二、解決過程

        這里很容易的一個懷疑點是原網頁上的網頁結構變化了,使用xpath選擇器進行提取的話,會出現不匹配的情況,列表索引不在范圍內,引起報錯。

        【Python進階者】給出了一個思路,確實可以使用try異常處理來避開,不過始終拿不到數據,確實有點讓人頭大。

        后來下午的時候【Python進階者】跑他代碼的時候發(fā)現了原因,如下圖所示。

        他的url這里,構造有問題,多了一個/,導致網頁訪問出錯。

        修改下,就可以跑了,另外,網頁詳情頁里邊也有多次請求,記得稍微sleep下,就可以了。下面是詳細代碼,感興趣的小伙伴們,可以拿去跑下。

        import?requests
        from?lxml?import?etree
        from?fake_useragent?import?UserAgent
        import?time


        class?kitchen(object):
        ????u?=?0

        ????def?__init__(self):
        ????????self.url?=?"https://www.xiachufang.com/category/40076/"
        ????????ua?=?UserAgent(verify_ssl=False)
        ????????for?i?in?range(1,?50):
        ????????????self.headers?=?{
        ????????????????'User-Agent':?ua.random,

        ????????????}

        ????'''發(fā)送請求??獲取響應'''

        ????def?get_page(self,?url):
        ????????res?=?requests.get(url=url,?headers=self.headers)
        ????????html?=?res.content.decode("utf-8")
        ????????time.sleep(2)
        ????????return?html

        ????def?parse_page(self,?html):
        ????????parse_html?=?etree.HTML(html)
        ????????image_src_list?=?parse_html.xpath('//li/div/a/@href')
        ????????for?i?in?image_src_list:
        ????????????try:
        ????????????????url?=?"https://www.xiachufang.com"?+?i
        ????????????????#?print(url)
        ????????????????html1?=?self.get_page(url)??#?第二個發(fā)生請求
        ????????????????parse_html1?=?etree.HTML(html1)
        ????????????????#?print(parse_html1)
        ????????????????num?=?parse_html1.xpath('.//h2[@id="steps"]/text()')[0].strip()

        ????????????????name?=?parse_html1.xpath('.//li[@class="container"]/p/text()')
        ????????????????ingredients?=?parse_html1.xpath('.//td//a/text()')
        ????????????????self.u?+=?1
        ????????????????#?print(self.u)
        ????????????????#?print(str(self.u)+"."+house_dict["名?稱?:"]+":")
        ????????????????#?da=tuple(house_dict["材?料:"])
        ????????????????food_info?=?'''??
        ????第?%s?種
        ????
        ????菜?名?:?%s
        ????原?料?:?%s
        ????下?載?鏈?接?:?%s,
        ????=================================================================
        ????????????????????????'
        ''?%?(str(self.u),?num,?ingredients,?url)
        ????????????????#?print(food_info)

        ????????????????f?=?open('下廚房菜譜.txt',?'a',?encoding='utf-8')
        ????????????????f.write(str(food_info))
        ????????????????print(str(food_info))
        ????????????????f.close()
        ????????????except:
        ????????????????print('xpath沒獲取到內容!')

        ????def?main(self):
        ????????startPage?=?int(input("起始頁:"))
        ????????endPage?=?int(input("終止頁:"))
        ????????for?page?in?range(startPage,?endPage?+?1):
        ????????????url?=?self.url.format(page)
        ????????????html?=?self.get_page(url)
        ????????????self.parse_page(html)
        ????????????time.sleep(2.4)
        ????????????print("====================================第?%s?頁?爬?取?成?功===================================="?%?page)


        if?__name__?==?'__main__':
        ????imageSpider?=?kitchen()
        ????imageSpider.main()

        跑出來的結果會保存到一個txt文件里邊,如下圖所示:

        碰到這種url拼接問題,推薦使用urljoin的方式,示例代碼如下:

        from?urllib.parse?import?urljoin
        source_url?=?'https://www.baidu.com/'
        child_url1?=?'/robots.txt'
        child_url2?=?'robots.txt'
        final_url1?=?urljoin(source_url,?child_url1)
        final_url2?=?urljoin(source_url,?child_url2)
        print(final_url1)
        print(final_url2)

        運行結果如下圖所示:

        urljoin的作用就是連接兩個參數的url,將第二個參數中缺的部分用第一個參數的補齊,如果第二個有完整的路徑,則以第二個為主。

        三、總結

        大家好,我是皮皮。這篇文章主要盤點一個網絡爬蟲中常見的一個錯誤問題,文中針對該問題給出了具體的解析和代碼演示,幫助粉絲順利解決了問題。最后給大家安利了一個url拼接的方法,在網絡爬蟲中還是非常常用的。

        最后感謝粉絲【雨就是雨】提問,感謝【Python進階者】給出的具體解析和代碼演示,感謝粉絲【?】、【艾希·覺羅】、【月神】、【dcpeng】、【瑜亮老師】等人參與學習交流。

        小伙伴們,快快用實踐一下吧!如果在學習過程中,有遇到任何Python問題,歡迎加我好友,我拉你進Python學習交流群共同探討學習。

        -------------------?End?-------------------

        往期精彩文章推薦:

        歡迎大家點贊,留言,轉發(fā),轉載,感謝大家的相伴與支持

        想加入Python學習群請在后臺回復【

        萬水千山總是情,點個【在看】行不行

        瀏覽 42
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            久久一区二区三区免费 | 欧美综合成人网 | 成人免费 做爱 | 欧美成人国产精品高潮 | 黑人大战黄人网站 | 国产精品久久久久久久久懂色 | 成人福利视频在线观看 | 爱草逼爱草逼爱草逼爱草逼爱草逼爱草逼 | 日韩免费一区二区在线观看 | 国产在线播精品第三 |