1.首先导入所需要的库,这里用到的主要是seleinum
请仔细查看代码注释
1 2 3 4 5 6 7 8 9 10 from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import \ expected_conditions as EC from selenium.webdriver.common.by import By import jsonimport csvimport requestsfrom lxml import etreeimport time
2.创建浏览器对象来以便进行浏览器操作 1 2 3 4 5 6 7 8 9 10 browser = webdriver.Chrome(executable_path='./chromedriver' ) url = 'https://weixin.sogou.com/' browser.get(url) data_list = [] page = 0
下面加入请求头信息,并完成登陆操作(登录之后才可以进行翻页和其它操作) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 def start_spiders (): headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36' } query = browser.find_element_by_id('query' ) keyword = input ('输入:' ) query.send_keys(keyword) swz = browser.find_element_by_class_name('swz' ) swz.click() top_login = browser.find_element_by_id('top_login' ) top_login.click() WebDriverWait(browser, 1000 ).until( EC.presence_of_all_elements_located( (By.CLASS_NAME, 'yh' ) ) ) print ('登陆成功' )
3.用Xpath来获取获取所需要的数据,其中题目坐着等信息在搜索的预览界面就可以进行爬取,文章的具体内容需要进入到文章链接中进行爬取 在末尾检测“下一页”的标签,如果存在就需要对其进行点击来完成翻页操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 num = 0 while True : for a in range (9 ): try : lis = browser.find_elements_by_xpath('//ul[@class="news-list"]/li' ) title = lis[a].find_element_by_xpath('.//h3' ).text author = lis[a].find_element_by_class_name('account' ).text datetime = lis[a].find_element_by_class_name('s2' ).text content = lis[a].find_element_by_class_name('txt-info' ).text href = lis[a].find_element_by_xpath('.//h3/a' ).get_attribute('href' ) id = '20190200514' browser.get(href) time.sleep(0.5 ) text_list = browser.find_elements_by_xpath('/html/body/div[1]/div[2]/div[1]/div/div[1]/div[3]/section' ) texts = "" for i in text_list: texts += (i.text) print (texts) data_dict = {} data_dict['text' ] = texts data_dict['title' ] = title data_dict['author' ] = author data_dict['datetime' ] = datetime data_dict['content' ] = content data_dict['href' ] = href data_dict['user_id' ] = id data_dict['key_words' ] = keyword data_list.append(data_dict) browser.back() except IndexError as i: print ("爬虫被检测,请手动输入验证码:" ) time.sleep(100 ) continue try : sogou_next = browser.find_element_by_id('sogou_next' ) sogou_next.click() num = num + 1 if num > page: break except Exception as e: break
注意: 由于搜狗微信的对于同一IP访问有一定的0数量限制,所以每天在爬取一定量的数据之后,会弹出验证码身份检验,本程序设置了100秒的输入时间,需要调用者手动输入验证码来进行验证,同时也可以在爬虫受限之后更改代理。 所以后续代码的改进方向为: 1.设置IP池,通过更换ip来从根本上解决验证问题(来源需要自己找,可以找网上的免费代理) 2.连接验证码打码平台,由于本程序是在爬取一定量数据之后才会触发检测,所以触发检测的机会较少,打码的必要性不是很大。 4. 最后编写执行程序代码块(文件输出方式可选json和csv输出) 1 2 3 4 5 6 7 8 9 10 11 12 def main (): start_spiders() if __name__ == '__main__' : main() browser.quit() print (data_list) with open ('data_json.json' , 'a+' , encoding='utf-8' ) as f: json.dump(data_list, f, ensure_ascii=False , indent=4 ) print ('json文件写入完成' )
也可以存储为CSV文件1 2 3 4 5 6 7 8 9 10 11 12 # 将数据存入csv文件中 # 表头 # csv_title = data_list[0].keys()#返回一个字典的【0】键 # with open('data_csv.csv', 'w', encoding='utf-8', newline='') as f: # writer = csv.writer(f) # # 写入表头 # writer.writerow(csv_title) # # 批量写入表 # for row in data_list: # writer.writerow(row.values()) # print('csv文件写入完成')
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !