1. 程式人生 > >記___美團爬蟲

記___美團爬蟲

上一次的淘寶,寫到一半被叫去做美團。。。。。。。呵呵了

我就直接,把我記錄在wps文件的,記錄分享出來了。莫怪

文字最後 是 githup 的程式碼地址

  1. 美團 美食 抓取;

  2. 1:Mysql 遇到的一個問題就是     “self.encoding = charset_by_name(self.charset).encoding”
  3. 原因在於 我把 python建立的mysql語句 “utf8”寫成了“utf-8”
  4. 2:
  5. 請求報錯  是太多連線沒有關閉,埠被佔用了
  1. 3:
  2. 注意  這裡不一定要糾結是不是程式碼錯了,很有可能是你的資料表的問題。因為修改之後,原先的資料表不刪除就寫不進去
  3. 4:
  4. 對於一個大型的爬蟲而言,設定異常時必須的,因為你也不知道在獲取網頁資料的時候會出現什麼情況,一旦出錯就會中斷爬取,耽誤時間。所以  要謹記 異常處理
  5. 5:美團 api 介面
  6. 杭州美食第一頁 http://hz.meituan.com/meishi/api/poi/getPoiList?cityName=%E6%9D%AD%E5%B7%9E&cateId=0&areaId=0&sort=&dinnerCountAttrId=&page=1&userId=&uuid=d7533380281d7c1cc28f.1532572421.0.0.0&platform=1&partner=126&originUrl=http%3A%2F%2Fhz.meituan.com%2Fmeishi%2F&riskLevel=1&optimusCode=1&_token=eJxtj1%2BPmkAUxb%2FLJH0qhZnhj4zJpkG2NGpcBQG1Gx%2BGEQQERBhhcdPv3iHtJvvQ5Cb33t85ybn3HTTzE5giCAmEEujiBkwBkqFsAAnwVii6ivUJ1gyCNWFgn9kEmsSUQNSEz2D6ikxdl1SCjyPxBHhFBEMJQRMepb8qgrpxlLAmanTNhQmknNdTRUkfchln%2FE4rmV1LRcxtminiiP%2Fr30vOn5CcxkX9BTu0zuTiIaNv2MQYy%2FkFDYhrFIiQ0h9DsIEl1dRGcBmB6PRf5x%2F7Snwu8trsXIkpXvRFHqB7n1tuGit237aX0zlbLKtytnN2N7wJrCLHbhCvkpyd5mx2MixCmb0yZjQJcKVrX7uIDbN15BuBfugVazOsY2JSO0Gky5WsZenZhtmw74u6vM3xIiP2vrueV9zbuuahy0qPKSuDvnAddrkVlQf4kl%2BxWetvxeHC1EczeM97d6uG3s13TPvntnmEqdKV9o9hCNng766lr8VD61T7KIebhKBlsbhzZ0lJCOnad2%2FYCeiwiya1GtpvyS%2Fvzp7A7z%2B9vqC0
  7. 杭州美食第二頁http://hz.meituan.com/meishi/api/poi/getPoiList?cityName=%E6%9D%AD%E5%B7%9E&cateId=0&areaId=0&sort=&dinnerCountAttrId=&page=2&userId=&uuid=d7533380281d7c1cc28f.1532572421.0.0.0&platform=1&partner=126&originUrl=http%3A%2F%2Fhz.meituan.com%2Fmeishi%2Fpn2%2F&riskLevel=1&optimusCode=1&_token=eJx9T8lu4kAU%2FJe%2BYtGLabCR5uAdkxDAxmwRB9tguwmNHa%2FEo%2Fx7OprMYS4jPanqVZVK7%2F0GpXsGU4yQipAE2ksJpgAP0XAMJFBXwqEyoRNC5bEywhKI%2F9EmijqWQFRuTTB9xQqlkqyS07fiCeEVqwRJGCnoJP1xMaLjk0RGYr5TrgiBrK6LKYRZP%2BQXVjfhfRjnHApeZQwWdwLFIf%2FNAFHFN6JK4NsPhj9Y%2F90X4i1RVLH0Lthl3t2um7rpem3tLSFL34M8KA433dG8RivSZlHpxmxeP%2FvzQWV3DlsqvqwYeEP8xEUfxtPlsE37OPKJmbRLblddD9PVA9fabKHAljT2wH48mK6%2B35yE73idWcVidAzVipuB73r3qzNAJN%2FRtmN0%2F1xoTN87fbNP%2BSO2izUNGf9YHVZeeWARNphqyRwnVh7wnHeJ3qeWGjlzz4qCdauszuGT3GbFzD1mk3ZXwaUfxHI%2BOO%2FyWDWvRbk9niFtX8y%2BNX0j%2FgU%2BvwDmHZlN
  8. 杭州美食第三頁

http://hz.meituan.com/meishi/api/poi/getPoiList?cityName=%E6%9D%AD%E5%B7%9E&cateId=0&areaId=0&sort=&dinnerCountAttrId=&page=3&userId=&uuid=d7533380281d7c1cc28f.1532572421.0.0.0&platform=1&partner=126&originUrl=http%3A%2F%2Fhz.meituan.com%2Fmeishi%2Fpn2%2F&riskLevel=1&optimusCode=1&_token=eJx9T8lu4kAU%2FJe%2BYtGLabCR5uAdkxDAxmwRB9tguwmNHa%2FEo%2Fx7OprMYS4jPanqVZVK7%2F0GpXsGU4yQipAE2ksJpgAP0XAMJFBXwqEyoRNC5bEywhKI%2F9EmijqWQFRuTTB9xQqlkqyS07fiCeEVqwRJGCnoJP1xMaLjk0RGYr5TrgiBrK6LKYRZP%2BQXVjfhfRjnHApeZQwWdwLFIf%2FNAFHFN6JK4NsPhj9Y%2F90X4i1RVLH0Lthl3t2um7rpem3tLSFL34M8KA433dG8RivSZlHpxmxeP%2FvzQWV3DlsqvqwYeEP8xEUfxtPlsE37OPKJmbRLblddD9PVA9fabKHAljT2wH48mK6%2B35yE73idWcVidAzVipuB73r3qzNAJN%2FRtmN0%2F1xoTN87fbNP%2BSO2izUNGf9YHVZeeWARNphqyRwnVh7wnHeJ3qeWGjlzz4qCdauszuGT3GbFzD1mk3ZXwaUfxHI%2BOO%2FyWDWvRbk9niFtX8y%2BNX0j%2FgU%2BvwDmHZlN

  1. 現在自己採用的不是API介面,應該是美團稍微簡單一些。所以我 使用的還是美團的常用URL
  2. 一個 經驗,就是邏輯要通,不要害怕會寫錯,有出錯才好。因為出錯了就會想辦法去更正,這一點一滴的積累會讓自己對技術成熟的更加嚮往
  3. 還有就是 對於反爬蟲的應用真的很重要,因為反爬降落了難度就會給自己更多的時間去挖資料,接下來就是各種文字載入技術了。
  1. 對於美團,個人覺得,最好最快的方式還是處理json檔案,再加上多執行緒那就更快了。唯一一個阻礙就是對於 反爬蟲的,最最好是cookies 加上 ip

  1. 對於 要求來說,存到mysql是一個列表,也不知道會不會有些影響,暫時放著
  2. ·資料庫的問題  用這一點解決了重複入庫,但是並沒有實現去重
  3. 反爬蟲的問題,這裡用的是heard,也不知道能撐多久。我想好用,分散式來看看這個會不會=更好

1.現在是 美團酒店

  1. 這是第三頁的ajax
  2. https://ihotel.meituan.com/hbsearch/HotelSearch?utm_medium=pc&version_name=999.9&cateId=20&attr_28=129&uuid=3663AFA62227A87C7B8D924A4A7A61B4E9ED311B50C3C2B08E0A1597707BBE5F%401532745915720&cityId=50&offset=60&limit=20&startDay=20180728&endDay=20180728&q=&sort=defaults&X-FOR-WITH=A9zBrWbsPy9%2FkB5OsIXp58FacGY2HnPpuTKcnXwAOE7xfmoKm2mgBv%2BakwTPMOHFHHtGB5FENmXhMb4oxlIx1r3vlngfPZbw8hhCc45On662dXFYtNJH7IXqIlwbNW7bjFZ9zV2L%2BCkDc21Batgesg%3D%3D
  3. https://ihotel.meituan.com/hbsearch/HotelSearch?utm_medium=pc&version_name=999.9&cateId=20&attr_28=129&uuid=3663AFA62227A87C7B8D924A4A7A61B4E9ED311B50C3C2B08E0A1597707BBE5F%401532747143283&cityId=50&offset=0&limit=20&startDay=20180728&endDay=20180728&q=&sort=defaults&X-FOR-WITH=hNIARlUNQ2iElBBJfKlI3Kc03DsgxjQIUSDERw5zzjTOZ6gat08IQND2aGfHUHRd7AgvlOPKbD64wlKL%2FHEyPqd6JOtJeiL6TFEPXkVPa8cdEc6C%2B%2FlrwuQ0ZmIv%2Ba51XkBmzbNfUH8R0Mq0IxcJ5A%3D%3D
  4. https://ihotel.meituan.com/hbsearch/HotelSearch?utm_medium=pc&version_name=999.9&cateId=20&attr_28=129&uuid=3663AFA62227A87C7B8D924A4A7A61B4E9ED311B50C3C2B08E0A1597707BBE5F%401532759522322&cityId=50&offset=20&limit=20&startDay=20180728&endDay=20180728&q=&sort=defaults&X-FOR-WITH=8hAtT%2BPr%2Fr9fruMiqXvKUYNdORB7Hh2d5cbvRPRXU%2BdxfBoJ7qX%2F9X8d580DCnxmPs86NvNMcgfwXhCzIKBhNFkisdbjasDM4hIeQx1lrv3amWaB%2FY%2FwwIJPfX%2B84nqrc7JtEU0VoFrfPJ%2F97aW7JQ%3D%3D
  5. 這是杭州酒店的第一頁的城市ajax連線,酒店不與美食相比,更加的嚴鎖。我的第一個想法還是構建url,肯定有很多方法,例如模擬瀏覽器行為,解析ajax。。。。。
  6. 偏移量 offset = 這裡考慮的是scrapy能不能迴圈請求,限定數看到不能是offset = 頁數 * 20,因為有的城市最後不一定是20.美團是這樣設定的,不管你有多少酒店一頁最多20,然後往後累加知道最後不足20.    美食就是最多一頁32,最多32頁。個人理解
  7. 首先  我想到的是一位大神寫的,感覺真不錯“token驗證”。因為我個人覺得,不能總是學著大家都在都會的技巧,總要掌握一些個別的技巧吧。並沒說是讓自己成為 群雞獨立 的這樣,看怎麼理解我說的了,你說對吧??
  8. 首先 經過試驗可以構造ajax進行請求,
  9. 但是資料有些不對,上面url,發現sort=defaults後面&接的是編碼,應該是‘吃喝玩樂。。。。啥啥的’。或者是別的解釋,應該不能用在一起,會被檢測到。所以,後邊的就不要了,取前面一部分
  1. 1,2兩張圖片  可以發現其實都是 js 產生的。3 圖片是打不開的,但是最後的數字是有用,用正則取出來,拼接成1,2型別的url
  2. https://ihotel.meituan.com/group/v1/poi/933710/imgs?utm_medium=touch&version_name=999.9&classified=true&X-FOR-WITH=5INGtURN7sNam4GpyRmKvyBNXktw8sM4V3zFVKRh0nJQfQaNxQcI87niwOblmDR9qLbYGZ6EI3ev%2BUMSLAUPcPO7C1LHmOjyDYPw74cDEAqLnVZRyPfyCOq6awS0%2BUrEkQQLLMcnKB7OxfcPeGFOyg%3D%3D
  3. 上面的連結是,圖片的url,但是打不開。

  1. 一個冷知識,關於 雙引號和單引號。在scrapy shell  一開始總犯錯
  1. 關於scrapy 請求response 的問題,是不是又先後順序?for迴圈是不是不是按照循序來的,一大群基礎冷知識。我對自己呵呵噠了。
  2. 這裡程式碼的意思,我要取出圖片的關鍵條碼,tdchotel/.jpg/png然後組成能開啟的url,原先直接一個for迴圈,造成圖片不與酒店對應。原因是圖片id居然和詳情id不一致,按理說for迴圈第一次和第二次取出來的值是一樣的。但是這裡不一樣,沒辦法了,為了一致,只有把詳情id取出,在拼接。 諸位 要習慣,程式設計師不只是要懂程式碼,還要知道業務,我的工作是對接專案所需要的資料,儘管我很不想這樣做
  3. Scrapy  shell 真的是一樣好的特別好的工具,不管是正則還是xpath還是bs4 css 甚至還可以response.text 返回直觀的資訊

1.

  1. 剛才粗心的,習慣性的按回車鍵。結果是  Item = HoeltItem()  少了括號
  2. 這裡我請求了兩個response,scrapy應該是按照什麼特性來請求的。所以 我覺得用 crawlspider 遞迴請求
  3. 昨天看到一個神器 scrapy-splash  就學著用,沒想到安裝出了問題。Pip3 一直顯示已安裝,但是並沒有。弄了半天,發現直接找到安裝的檔案,然後刪除 再安裝  rm -rf
  4.  對比url,找到城市ID
  5. 'https://ihotel.meituan.com/hbsearch/HotelSearch?utm_medium=pc&version_name=999.9&cateId=50&attr_28=129&uuid=3663AFA62227A87C7B8D924A4A7A61B4E9ED311B50C3C2B08E0A1597707BBE5F%401532759522322&cityId=50&offset=0&limit=20&startDay=20180728&endDay=20180728&q=&sort=defaults'
  6. https://ihotel.meituan.com/hbsearch/HotelSearch?utm_medium=pc&version_name=999.9&cateId=20&attr_28=129&uuid=3663AFA62227A87C7B8D924A4A7A61B4E9ED311B50C3C2B08E0A1597707BBE5F%401532745915720&cityId=50&offset=60&limit=20&startDay=20180728&endDay=20180728&q=&sort=defaults
  7. https://ihotel.meituan.com/hbsearch/HotelSearch?utm_medium=pc&version_name=999.9&cateId=20&attr_28=129&uuid=3663AFA62227A87C7B8D924A4A7A61B4E9ED311B50C3C2B08E0A1597707BBE5F%401533005717401&cityId=807&offset=20&limit=20&startDay=20180731&endDay=20180731&q=&sort=defaults
  8. 不管是酒店,還是美食,到了最後幾頁,商店的資訊都不完整。用re.search().grup(),就會報錯,而不會報空。再有 用if 判斷每條資訊會不會太繁瑣了。
  9. 暫時 先停下,被安排,研究拼多多
  10. 首先相信美團的工程師們 會來csdn溜達,程式碼我就不去公佈了,我自己改成了scrapy,現在打算改scrapy_redis分散式,一個城市一線大概都在兩萬以上,二線基本是千把個。遇到最大的問題就是302驗證碼,和空資料。我寫了ip池和cookies來應對,然後單純的空,需要另外看了。謝謝 美團工程師的仁慈了