Python爬虫编程实践--大作业

感谢Datawhale组织的学习,经过这几天的学习,已经初步了解了简单的python爬虫实现,这里简单介绍一个新闻的爬虫实现。

爬取新闻

  1. 了解ajax加载
  2. 通过chrome的开发者工具,监控网络请求,并分析
  3. 用selenium完成爬虫
  4. 具体流程如下:
    用selenium爬取https://news.qq.com/ 的热点精选
    至少爬50个出来,存储成csv

之所以要使用selenium,是因为新闻的网页是动态的,它会根据使用的操作来加载,因此需要selenium模拟用户的操作。

import time
from  selenium import webdriver
from bs4 import BeautifulSoup
import csv

如果静态的打开新闻的网页,仅能加载出10条新闻,若想加载的更多需要将鼠标滚动到页面底部,为了安全起见,每次操作的前后都sleep1秒
翻页的次数根据要爬取的新闻数进行估算

def getHTMLText(url, num):
    driver = webdriver.Chrome()
    driver.get(url)
    #driver.get("https://news.qq.com/")
    page = int(num/10) + 1
    for i in range(page):
        time.sleep(1)
        #鼠标滚动到页面最低部,为了加载后面的新闻
        driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
        time.sleep(1)
    html = driver.page_source
    driver.quit()  # 关闭浏览器窗口
    return html

然后用BeautifulSoup库识别出要爬取的页面信息并加以存储

def parseHTML(html, item):
    soup = BeautifulSoup(html, 'html.parser')
    for li in soup.find_all('li',['item cf','item-pics cf']):
        if li.attrs['class'] == ['item', 'cf']:
            alist = li('a')[1]
        else:
            alist = li('a')[0]
        item.append([alist.text.lstrip(),alist.attrs['href']])

接下来将爬取到的信息打印出来,并存储为csv格式的文件

def printNews(item, num):
    tplt = "{0:<1} , {1:{3}<1} , {2:<10}"
    with open('news.csv', 'w') as f: 
        # 实例化csv.writer对象
        writer = csv.writer(f)
        # 用writerows方法将数据以指定形式保存
        writer.writerow(['index', 'title', 'url'])
        print(tplt.format('index', 'title', 'url', chr(12288)))
        
        for i in range(num):
            u = item[i]
            writer.writerow([str(i+1), u[0], u[1]])
            print(tplt.format(i+1, u[0], u[1], chr(12288)))
url = "https://news.qq.com/"
item = []
num = 50
html = getHTMLText(url, num)
parseHTML(html, item)
printNews(item, num)

我之前翻页采用的是笨办法,每次将鼠标滚动至页面底部,还可以每次滚动一定的距离,这里是固定的像素,不过效果都是相同的。

import time
from  selenium import webdriver
driver=webdriver.Chrome(executable_path="D:\chromedriver\chromedriver.exe")
driver.get("https://news.qq.com")
#了解ajax加载
for i in range(1,100):
    time.sleep(2)
    driver.execute_script("window.scrollTo(window.scrollX, %d);"%(i*200))

你可能感兴趣的:(Python爬虫编程实践--大作业)