先前發文
DAY 01 : 參賽目的與規劃
DAY 02 : python3 virtualenv 建置
DAY 03 : python3 request
DAY 04 : 使用beautifulsoup4 和lxml
DAY 05 : select 和find 抓取tag
DAY 06 : soup解析後 list取值
DAY 07 : request_header_cookie 通過網頁18限制
DAY 08 : ppt內文爬取
DAY 09 : 資料處理 split replace strip
DAY 10 : python csv 寫入 和dict 合併
DAY 11 : python class function
DAY 12 : crawl 框架 scrapy 使用
DAY 13 : scrapy 架構
DAY 14 : scrapy pipeline data insert mongodb
DAY 15 : scrapy middleware proxy
DAY 16 : scrapy selenium
DAY 17 : scrapy 爬取js畫面資料(二)
DAY 18 : scrapy splash 爬取js畫面資料(三)
DAY 19 : python .env 使用
DAY 20 : python chartify 資料視覺化套件
DAY 21 : python3 pandas 資料處理
DAY 22 : scrapy 資料應用apriori
DAY 23 : Datamining twitch data
DAY 24 : scrapy facebook crawl (一)
DAY 25 : scrapy facebook crawl (二)
今天就來爬一下每個文章的連結 , 由於select 及 find 還有一個是xpath抓取方式 , 下面的code 是從一位大神拿來改的
工商一下他的github , 那拿來改的原因是他的code 我的需求沒有用到這麼都的功能
有興趣的可以去看一下他的完整功能的專案
def parse_page(self, response):
soup = BeautifulSoup(response.text, 'lxml')
# select all posts
posts = response.xpath("//div[contains(@data-ft,'top_level_post_id')]")
posts = set(posts)
for post in posts:
new = ItemLoader(item=FbcrawlItem(),selector=post)
#加入方法並使用寫在item裡的方法做資料處理
# new.add_xpath('comments', "./div[2]/div[2]/a[1]/text()")
post = post.xpath(".//a[contains(@href,'footer')]/@href").extract()#.getdata
# new.add_value('url', "https://mbasic.facebook.com"+post[0])
temp_post = response.urljoin(post[0])
self.count -= 1
# with open ('comment_urls.csv','a+') as f :
# f.write(str(temp_post)+'\n')
yield scrapy.Request(temp_post, self.parse_post)
new_page = response.xpath("//div[2]/a[contains(@href,'timestart=') and not(contains(text(),'ent')) and not(contains(text(),number()))]/@href").extract()
#換頁
if not new_page:
print('new_page tag is not find')
else:
print('next')
new_page = response.urljoin(new_page[0])
if 'flag' in response.meta:
print('next page')
yield scrapy.Request(new_page, callback=self.parse_page, meta={'flag':response.meta['flag']})
else:
yield scrapy.Request(new_page, callback=self.parse_page, meta={'flag':self.k})
def parse_post(self,response):
with open ('comment_urls.csv','a+') as f :
f.write(str(response.url)+'\n')