小白入坑第二步

任务来袭

了解基本语言

内容:

  • 使用phpstudy软件搭建php环境;
  • 了解php基本语法知识;
  • 安装python语言环境;
  • 阅读requests库文档;
  • 写出百度搜索结果爬虫脚本;

使用phpstudy软件搭建php环境

  • 首先安装phpstudy

  • phpstudy的简单使用

    • 在地址栏输入127.0.0.1或者localhost(即本机)会出现下面结果
      2.2
      2.3

    • 更改端口
      在“其他选项菜单”中找到“软件设置”、“端口常规设置”
      2.4
      看到默认端口为802.5
      更改端口值,相应的地址栏输入也要进行更改:
      localhost:端口号/xxx.php
      (当端口值为80时,可以为:localhost/xxx.php )

    • 更改目录
      一般默认C:\phpStudy\PHPTutorial\WWW为放代码的地方,倘若将这里路径进行更改,一定要记得将WWW文件下的相应代码复制到更改的文件下,不然会报错哦
      2.6

    • 更改页面内容
      首先在默认首页里进行更改 2.7
      再在WWW下将相应的文件代码进行修改
      2.8 2.10
      2.9
      再次打开就是更改后的首页了
      2.11

  • 在这里推荐一篇大佬的博客:
    https://blog.csdn.net/williamgavin/article/details/79176325

了解php基本语法知识

php以<?php开始,以?>结束,每一行代码都必须以分号结束。

<!DOCTYPE html>
<html>
<boby>
<h1>这是我的第一个PHP页面</h1>
<?php
echo "Hello World";//两种在浏览器输出文本的基础指令:echo   print
//这是一行注释
/*
这
是
多
行
注
释
*/
?>
</boby>
</html>

php变量

以$符号开始,后接变量名称

PHP没有声明变量的命令,在第一次被赋值时被创建

PHP会根据变量的值,自动把变量转换成正确的数据类型

PHP有四种不同的变量作用域:

local global static parameter

局部作用域、全局作用域

  • 在所有函数外部定义的变量是全局变量,可被脚本中的任何部分访问(访问需使用global关键字)
  • 在函数内部生命的变量是局部变量,仅在该函数内部被访问
  • 当一个函数完成时,其所有变量都会被删除。若不希望摸个局部变量被删除,可以使用static关键字。
  • 参数作用域:参数是通过调用代码将值传递给函数的局部变量,是在参数列表中生声明的,作为函数声明的一部分。
<?php
$x=5;//全局变量
function mytest()//参数作用域:function mytest($y)
{                   //若在函数内部调用函数外的全局变量,应为:global $x;
    $y=8;//局部变量、不被删除:static $y=8;
    echo "<p>测试变量在函数内部:<p>';
    echo "变量x为:$x";
    echo "<br>";
    echo "变量y为:$y";
}
mytest();
echo "<p>测试变量在函数外部:<p>";
echo "变量x为:$x";
echo "<br>";
echo "变量y为:$y";
?>

输出语句

  • echo 可以输出一个或多个字符串,速度快,无返回值
  • print 只允许输出一个字符串,返回值总为1

数据类型

  • String(字符串)
  • Integer(整型)
  • Float(浮点型)
  • Boolean(布尔型)
  • Array(数组)
  • Object(对象)、NULL(空值)

常量

在脚本中,值不可改变,在整个脚本中均可使用。

设置常量,用define()函数:

define(string constant_name,nixed value,case_sensitive=true)

其中,constant_name,必选参数,常量名称,即标志符;value,必选参数,常量的值;case_sensitive,可选参数,指定是否大小写敏感,设定为 true 表示不敏感。

安装python语言环境

在cmd界面下,打开python

>python

2.12

(我这里设置为python3)

若得不到相应的正确显示,要手动添加环境变量

“此电脑”右键“属性”,找到“高级系统设置”,点击“环境变量”

2.13

找到“path”点击“编辑”,点击“新建”,将文件路径添加进去

2.14

2.15

接下来安装pip,找到并打开python目录,找到Scripts,打开

2.16

找到pip.exe,并运行

2.17

阅读reuests库文档

百度搜索结果爬虫脚本

终端输入命令:

python baidu_crawler.py -k inurl:asp?id= -p 2

其中,脚本命名为baidu_crawler.py,有三个参数,-k是必须的,后接搜索关键词,-t后接一个整数,是超时时间,默认为60秒,-p后接一个整数,是要爬取的总页数,默认为5页

源程序代码:

# !/usr/bin/python 
# -*- coding:UTF-8 -*-
import re 
import requests 
import traceback 
from urllib import quote 
import sys, getopt 
reload(sys) 
sys.setdefaultencoding('utf-8') 
class crawler: 
	'''爬百度搜索结果的爬虫'''
	url = u'' 
	urls = [] 
	o_urls = [] 
	html = '' 
	total_pages = 5 
	current_page = 0 
	next_page_url = '' 
	timeout = 60 #默认超时时间为60秒 
	headersParameters = { #发送HTTP请求时的HEAD信息,用于伪装为浏览器 
	'Connection': 'Keep-Alive', 
	'Accept': 'text/html, application/xhtml+xml, */*', 
	'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3', 
	'Accept-Encoding': 'gzip, deflate', 
	'User-Agent': 'Mozilla/6.1 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko' 
	} 
	def __init__(self, keyword): 
		self.url = u'https://www.baidu.com/baidu?wd='+quote(keyword)+'&tn=monline_dg&ie=utf-8' 

	def set_timeout(self, time): 
		'''设置超时时间,单位:秒'''
		try: 
			self.timeout = int(time) 
		except: 
			pass 
	def set_total_pages(self, num): 
		'''设置总共要爬取的页数''' 
		try: 
			self.total_pages = int(num) 
		except: 
			pass 
	def set_current_url(self, url): 
		'''设置当前url''' 
		self.url = url 
	def switch_url(self): 
		'''切换当前url为下一页的url若下一页为空,则退出程序''' 
		if self.next_page_url == '': 
			sys.exit() 
		else: 
			self.set_current_url(self.next_page_url) 
	def is_finish(self): 
		'''判断是否爬取完毕''' 
		if self.current_page >= self.total_pages: 
			return True 
		else: 
			return False 
	def get_html(self): 
		'''爬取当前url所指页面的内容,保存到html中''' 
		r = requests.get(self.url ,timeout=self.timeout, headers=self.headersParameters) 
		if r.status_code==200: 
			self.html = r.text 
			self.current_page += 1 
		else: 
			self.html = u'' 
			print '[ERROR]',self.url,u'get此url返回的http状态码不是200' 
	def get_urls(self): 
		'''从当前html中解析出搜索结果的url,保存到o_urls''' 
		o_urls = re.findall('href\=\"(http\:\/\/www\.baidu\.com\/link\?url\=.*?)\" class\=\"c\-showurl\"', self.html) 
		o_urls = list(set(o_urls)) #去重 
		self.o_urls = o_urls #取下一页地址 
		next = re.findall(' href\=\"(\/s\?wd\=[\w\d\%\&\=\_\-]*?)\" class\=\"n\"', self.html) 
		if len(next) > 0: 
			self.next_page_url = 'https://www.baidu.com'+next[-1] 
		else: 
			self.next_page_url = '' 
	def get_real(self, o_url): 
		'''获取重定向url指向的网址''' 
		r = requests.get(o_url, allow_redirects = False) #禁止自动跳转 
		if r.status_code == 302: 
			try: 
				return r.headers['location'] #返回指向的地址 
			except: 
				pass 
		return o_url #返回源地址 
	def transformation(self): 
		'''读取当前o_urls中的链接重定向的网址,并保存到urls中''' 
		self.urls = [] 
		for o_url in self.o_urls: 
			self.urls.append(self.get_real(o_url)) 
	def print_urls(self): 
		'''输出当前urls中的url''' 
		for url in self.urls: 
			print url 
	def print_o_urls(self): 
		'''输出当前o_urls中的url''' 
		for url in self.o_urls: 
			print url 
	def run(self):
		while(not self.is_finish()): 
		 	c.get_html() 
		 	c.get_urls() 
	 		c.transformation() 
		 	c.print_urls() 
		 	c.switch_url() 
if __name__ == '__main__': 
	help = 'baidu_crawler.py -k <keyword> [-t <timeout> -p <total pages>]' 
	keyword = None 
	timeout = None 
	totalpages = None 
	try: 
		opts, args = getopt.getopt(sys.argv[1:], "hk:t:p:") 
	except getopt.GetoptError: 
		print(help) 
		sys.exit(2) 
	for opt, arg in opts: 
		if opt == '-h': 
			print(help) 
			sys.exit() 
		elif opt in ("-k", "--keyword"): 
			keyword = arg 
		elif opt in ("-t", "--timeout"): 
			timeout = arg 
		elif opt in ("-p", "--totalpages"): 
			totalpages = arg 
	if keyword == None: 
		print(help) 
		sys.exit() 
	c = crawler(keyword) 
	if timeout != None: 
		c.set_timeout(timeout) 
	if totalpages != None: 
		c.set_total_pages(totalpages) 
	c.run()

搜索如图:

2.28

在这里感谢以为大佬:https://blog.csdn.net/wn314/article/details/76595472

发布了54 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wyj_1216/article/details/85137277