P

Python程序设计—登陆抓取

古月 2023-11-03

实验要求:

编写Python程序,完成如下任务:

  • 编写网页抓取程序,抓取北邮人论坛的求职信息板块中,日期为“昨天”“0点至23 点59分59秒”的所有帖子的标题,最多向前翻5页。
  • 抓取完成后,将上述列表中的数据写入一个csv文件,第1列为序号,第2列为标题名 字。该CSV文件的名字为“BYR-JOB-YYYY-MM-DD”。

设计思路及实现:

1.使用geckodriver作为driver程序在火狐浏览器上实现北邮人论坛的账号密码输入及登陆:

byr_driver = webdriver.Firefox()
byr_driver.get("http://bbs.byr.cn/index")

user_input=byr_driver.find_element('css selector','input[name="id"]')
user_input.send_keys('zhanghao')
time.sleep(1)
pw_input=byr_driver.find_element('css selector','input[name="passwd"]')
pw_input.send_keys('mima')
time.sleep(1)

login_button=byr_driver.find_element('css selector','input[id="b_login"]')
login_button.submit()
time.sleep(5)

2.利用By模块对页面进行文本筛选并跳转至目标页面:

link_element = byr_driver.find_element(By.LINK_TEXT, "信息社会")
link_element.click()
time.sleep(2)

link_element = byr_driver.find_element(By.LINK_TEXT, "毕业生找工作")
link_element.click()
time.sleep(2)

3.分析目标页面HTML文件,发现页面帖子均位于table下的tbody下的tr对象中,利用find方法获取tr对象,并逐一检验tr对象中的td对象的日期是否符合要求,若符合,提取其td对象中的主题字符串保存在列表中,上述过程用函数封装:

def scrape_posts_in_range(target_date):
    post_list = byr_driver.find_elements(By.XPATH, '//table[@class="board-list tiz"]//tbody//tr')

    for post in post_list:
        
        date_element = post.find_element(By.CLASS_NAME, 'title_10')
        post_date = date_element.text.strip()
        if post_date == target_date:
            title_element = post.find_element(By.CLASS_NAME, 'title_9')
            title = title_element.text
            print(title)
            title_list.append(title)

4.构建循环逐次访问前五页:

for _ in range(5):
    scrape_posts_in_range(yesterday)

    next_page_button = byr_driver.find_element(By.XPATH, '//li[@class="page-normal"]/a[@title="下一页"]')
    next_page_button.click()

    time.sleep(2)

5.构建csv文件并将保存在列表中的数据按要求以此写入:

csv_file_name = f'BRY-JOB-{yesterday}.csv'

with open(csv_file_name, 'w', newline='', encoding='utf-8') as csvfile:
    csvwriter = csv.writer(csvfile)
    csvwriter.writerow(['序号', '主题']) 

with open(csv_file_name, 'a', newline='', encoding='utf-8') as csvfile:
    csvwriter = csv.writer(csvfile)
    for i, data in enumerate(title_list, start=1):
        csvwriter.writerow([i, data])

程序测试:

经测试及检验,输出结果正确,并保存于csv文件中。

总结分析:

1.进行该项目的重点是理清目标网页的HTML内容。

2.要注意对页面内容对象查找的方法。

3.对于生成csv文件,不应该想着在前面循环中一次性生成,会增大代码构建的复杂度,对于低维度数据,可以考虑使用列表或对象暂时保存,后续再处理保存的数据并进行相应的处理,这是一种工程性方法。

评论(0)

发布评论