python中文社區
『壹』 求個可以學習python的中文網站
python愛好者論壇,啥都有,適合新手。
http://www.pythonfan.org/
『貳』 python有哪些比較人氣多的中文論壇
看官方文檔吧,論壇沒啥用
『叄』 如何抓取汽車之家的車型庫 Python中文社區
實際上,關於「如何抓取汽車之家的車型庫」,我已經在「使用 Mitmproxy 分析介面」一文中給出了方法,不過那篇文章里講的是利用 API 介面來抓取數據,一般來說,因為介面不會頻繁改動,相對 WEB 頁面而言更穩定,所以通常這是數據抓取的最佳選擇,不過利用 API 介面來抓取數據有一些缺點,比如有的數據沒有 API 介面,亦可能雖然有 API 介面,但是數據使用了加密格式,此時只能通過 WEB 頁面來抓取數據。
既然要通過 WEB 頁面來抓取數據,那麼就不得不提到Scrapy,它可以說是爬蟲之王,我曾經聽說有人用 Scrapy,以有限的硬體資源在幾天的時間里把淘寶商品數據從頭到尾擼了一遍,如此看來,本文用 Scrapy 來抓取汽車之家的車型庫應該是綽綽有餘的了。
在抓取汽車之家的車型庫之前,我們應該對其結構有一個大致的了解,按照網路中的描述,其大致分為四個級別,分別是品牌、廠商、車系、車型。本文主要關注車系和車型兩個級別的數據。在抓取前我們要確定從哪個頁面開始抓取,比較好的選擇有兩個,分別是產品庫和品牌找車,選擇哪個都可以,本文選擇的是品牌找車,不過因為品牌找車頁面使用了 js 來按字母來載入數據,所以直接使用它的話可能會有點不必要的麻煩,好在我們可以直接使用從A到Z的字母頁面。
假設你已經有了 Scrapy 的運行環境(註:本文代碼以 Python3 版本為准):
shell> scrapy startproject autohome
shell> cd autohome
shell> scrapy genspider automobile www.autohome.com.cn -t crawl
如此就生成了一個基本的蜘蛛骨架,需要說明的是 Scrapy 有兩種蜘蛛,分別是 spider 和 crawl,其中 spider 主要用於簡單的抓取,而 crawl 則可以用來實現復雜的抓取,復雜在哪裡呢?主要是指蜘蛛可以根據規則萃取需要的鏈接,並且可以逐級自動抓取。就抓取汽車之家的車型庫這個任務而言,使用 spider 就可以實現,不過鑒於 crawl 在功能上更強大,本文選擇 crawl 來實現,其工作流程大致如下:通過 start_urls 設置起始頁,通過 rules 設置處理哪些鏈接,一旦遇到匹配的鏈接地址,那麼就會觸發對應的 callback,在 callback 中可以使用 xpath/css 選擇器來選擇數據,並且通過 item loader 來載入 item:
車系
車型
文件:autohome/items.py:
# -*- coding: utf-8 -*-
import scrapy
from scrapy.loader.processors import MapCompose, TakeFirst
class SeriesItem(scrapy.Item):
series_id = scrapy.Field(
input_processor=MapCompose(lambda v: v.strip("/")),
output_processor=TakeFirst()
)
series_name = scrapy.Field(output_processor=TakeFirst())
class ModelItem(scrapy.Item):
model_id = scrapy.Field(
input_processor=MapCompose(lambda v: v[6:v.find("#")-1]),
output_processor=TakeFirst()
)
model_name = scrapy.Field(output_processor=TakeFirst())
series_id = scrapy.Field(output_processor=TakeFirst())
文件:autohome/autohome/spiders/automobile.py:
# -*- coding: utf-8 -*-
import json
import string
from scrapy import Request
from scrapy.http import htmlResponse
from scrapy.linkextractors import LinkExtractor
from scrapy.loader import ItemLoader
from scrapy.spiders import CrawlSpider, Rule
from urllib.parse import parse_qs, urlencode, urlparse
from autohome.items import ModelItem, SeriesItem
class AutomobileSpider(CrawlSpider):
name = "automobile"
allowed_domains = ["www.autohome.com.cn"]
start_urls = [
"" + x + ".html"
for x in string.ascii_uppercase if x not in "EIUV"
]
rules = (
Rule(LinkExtractor(allow=("/\d+/#",)), callback="parse_item"),
)
def parse(self,response):
params = {
"url": response.url,
"status": response.status,
"headers": response.headers,
"body": response.body,
}
response = HtmlResponse(**params)
return super().parse(response)
def parse_item(self, response):
sel = response.css("div.path")
loader = ItemLoader(item=SeriesItem(), selector=sel)
loader.add_css("series_id", "a:last-child::attr(href)")
loader.add_css("series_name", "a:last-child::text")
series = loader.load_item()
# 即將銷售 & 在售
for sel in response.css("div.interval01-list-cars-infor"):
loader = ItemLoader(item=ModelItem(), selector=sel)
loader.add_css("model_id", "a::attr(href)")
loader.add_css("model_name", "a::text")
loader.add_value("series_id", series['series_id'])
yield loader.load_item()
# 停售
url = ""
years = response.css(".dropdown-content a::attr(data)")
for year in years.extract():
qs = {
"y": year,
"s": series["series_id"]
}
yield Request(url + "?" + urlencode(qs), self.stop_sale)
def stop_sale(self, response):
data = parse_qs(urlparse(response.url).query)
body = json.loads(response.body_as_unicode())
for spec in body["Spec"]:
yield {
"model_id": str(spec["Id"]),
"model_name": str(spec["Name"]),
"series_id": str(data["s"][0]),
}
把如上兩段源代碼拷貝到對應的文件里,下面我們就可以讓蜘蛛爬起來了:
shell> scrapy crawl automobile -o autohome.csv
抓取的結果會保存到 autohome.csv 里。如果保存到 json 文件中,那麼有時候你可能會發現輸出的都是 unicode 編碼,此時可以設置FEED_EXPORT_ENCODING來解決,如果想保存到資料庫中,那麼可以使用 Scrapy 的pipeline來實現。
如果你完整讀過 Scrapy 的文檔,那麼可能會記得在spiders一章中有如下描述:
When writing crawl spider rules, avoid using parse as callback, since the CrawlSpider uses the parse method itself to implement its logic. So if you override the parse method, the crawl spider will no longer work.
意思是說,在使用 crawl 的時候,應該避免覆蓋 parse 方法,不過本文的源代碼中恰恰重寫了 parse 方法,究其原因是因為汽車之家的字母頁存在不規范的地方:
shell> curl -I h
HTTP/1.1 200 OK
Date: ...
Server: ...
Content-Type: text/html, text/html; charset=gb2312
Content-Length: ...
Last-Modified: ...
Accept-Ranges: ...
X-IP: ...
Powerd-By-Scs: ...
X-Cache: ...
X-Via: ...
Connection: ...
乍看上去好像沒什麼問題,不過仔細一看就會發現在 Content-Type 中 text/html 存在重復,此問題導致 Scrapy 在判斷頁面是否是 html 頁面時失敗。為了修正此問題,我重寫了 parse 方法,把原本是 TextResponse 的對象重新包裝為 HtmlResponse 對象。通過抓取竟然還幫助汽車之家找到一個 BUG,他們真是應該謝謝我才對。
有時候,為了避免蜘蛛被對方屏蔽,我們需要偽裝 User-Agent,甚至通過一些代理服務來偽裝自己的 IP,本文篇幅所限,就不多說了,實際上,Scrapy 不僅僅是一個庫,更是一個平台,本文涉及的內容只能算是管中窺豹,有興趣的讀者不妨多看看官方文檔,此外,網上也有很多例子可供參考。
0 0
『肆』 Python中文下載
搜索抄 中蟒,中文的襲python語言,
如果英文不好,比較適合你
http://www.chinesepython.org/cgi_bin/cgb.cgi/home.html
『伍』 推薦幾個學習Python的免費網站
1、Python @ Coursera
Pythonspot是一個綜合教程,劃分了很多不同類別的知識板塊,首先你將擁有初學者資源來幫你開始Python的學習,然後你繼續保持前進你能學到更多關於使用Python開發web等。
『陸』 python學習論壇或者社區,推薦,
搜一些python交流群群文件里有很多好的教程的中文關於編程的社區貌似都不怎麼熱
『柒』 學習python比較好的中文網站有哪些!
有的,比如路飛學城官網的文檔!裡面有一本叫做Python全棧開發的書!你們可以去看下,裡面寫得通俗易懂!
『捌』 python有哪些比較人氣多的中文論壇啊經常有一些問題需要和大家請教。謝謝。
Python中文社區:知乎專欄
Python中文社區維基:python-chinese.GitHub.io
『玖』 有沒有推薦的python中文社區
搜一些python交流群
群文件里有很多好的教程的
中文關於編程的社區貌似都不怎麼熱
『拾』 2017年,有哪些比較活躍的中文Python社區
先說結論: 不是Python社區不成熟, 而是不活躍.
再說成因: 索取的人多了, 貢獻的人少了. 服務不過來了.
想當年列表裡面各種大牛, 要麼CTO, 要麼自己創業, 等等太忙了, 沒有時間為社區貢獻大把時間.
現在核心骨幹只有大媽(ZQ)和Sting(陳世欣)等人苦苦撐著. 也有很多社區大牛為社區提供資源和贊助等等.